2017-04-14 1 views
4

Ich versuche, meine EF6 DbContext zu verhöhnen und alles funktioniert für Add, Update, Find Methoden. Aber es funktioniert nicht für Remove Methode aus unbekannten Gründen.Moq & EF6 - Mocking EF6 Entfernen Sie die Methode, ein Objekt nicht entfernen

Theoretisch sollte nach dem Entfernen der Students Sammlung nur noch 1 Rücksprung übrig sein. Aber es gibt immer wieder den Count - 2.

Ich habe 3 Moq .Verify überprüft, um sicherzustellen, dass alle Methoden aufgerufen werden und sie tatsächlich ausgeführt werden. Aber es entfernt das Objekt nicht wirklich aus der Schülersammlung.

Wenn ich Assert.Equal Zeile kommentiert, die die Zählungen überprüfen, ist der ganze Test bestanden.

Löschen XUnit Methode

[Fact] 
public void Delete() 
{    
    Mock<DbContexts.MVCWebAppDbContext> dbContext = new Mock<DbContexts.MVCWebAppDbContext>(); 
    IStudentsService studentService = new StudentsService(dbContext.Object); 

    var students = new List<Student>() 
    { 
     new Student() { StudentID = 1, RefNo = "12456343", FirstName = "John", LastName = "Smith", DateOfBirth = DateTime.Now.AddYears(-10), DateCreated = DateTime.Now }, 
     new Student() { StudentID = 2, RefNo = "87984564", FirstName = "Pete", LastName = "Luck", DateOfBirth = DateTime.Now.AddYears(-20), DateCreated = DateTime.Now.AddDays(1) } 
    }; 

    var mockSet = new Mock<DbSet<Student>>(); 
    mockSet.As<IQueryable<Student>>().Setup(m => m.Provider).Returns(students.AsQueryable().Provider); 
    mockSet.As<IQueryable<Student>>().Setup(m => m.Expression).Returns(students.AsQueryable().Expression); 
    mockSet.As<IQueryable<Student>>().Setup(m => m.ElementType).Returns(students.AsQueryable().ElementType); 
    mockSet.As<IQueryable<Student>>().Setup(m => m.GetEnumerator()).Returns(students.AsQueryable().GetEnumerator()); 

    mockSet.Setup(m => m.Remove(It.IsAny<Student>())).Callback<Student>((entity) => students.Remove(entity)); 

    dbContext.Setup(c => c.Students).Returns(mockSet.Object); 

    int idToDelete = 1; 

    dbContext.Setup(s => s.Students.Find(idToDelete)).Returns(students.Single(s => s.StudentID == idToDelete)); 

    // call delete method now 
    studentService.Delete(idToDelete); 

    // 1 object deleted, it should return 1 
    Assert.Equal(1, students.Count()); // <----- Error here 

    dbContext.Verify(s => s.Students.Find(idToDelete), Times.Once); 
    dbContext.Verify(s => s.Students.Remove(It.IsAny<Student>()), Times.Once); 
    dbContext.Verify(s => s.SaveChanges(), Times.Once); 
} 

StudentService.cs Delete-Methode

MVCWebAppDbContext _context; 

public StudentsService(MVCWebAppDbContext context) 
{ 
    _context = context; 
} 

public int Delete(int id) 
{ 
    var objToDelete = _context.Students.Find(id); 

    if (objToDelete != null) 
    { 
     _context.Students.Remove(objToDelete); 
     return _context.SaveChanges(); 
    } 

    return -1; 
} 

Könnte euch bitte helfen Sie mir mit diesem Remove-Methode spöttisch?

+0

Und welchen Wert Delete zurückgibt? – Evk

+0

Ich habe es debuggt und es gibt "1" zurück. – TTCG

Antwort

4

ersetzen

mockSet 
    .Setup(m => m.Remove(It.IsAny<Student>())) 
    .Callback<Student>((entity) => students.Remove(entity)); 

mit

dbContext 
    .Setup(m => m.Students.Remove(It.IsAny<Student>())) 
    .Callback<Student>((entity) => students.Remove(entity)); 

Der größte Teil der Einrichtung durchgeführt wurde die DbContext.Students verwendet, die das Setup überschreibt auf DbSet.Remove

In der Tat kann man eigentlich alle DbSet spöttischen entfernen und Test würde noch gehen

[Fact] 
public void Delete() { 
    var dbContext = new Mock<DbContexts.MVCWebAppDbContext>(); 
    IStudentsService studentService = new StudentsService(dbContext.Object); 

    var students = new List<Student>() 
    { 
     new Student() { StudentID = 1, RefNo = "12456343", FirstName = "John", LastName = "Smith", DateOfBirth = DateTime.Now.AddYears(-10), DateCreated = DateTime.Now }, 
     new Student() { StudentID = 2, RefNo = "87984564", FirstName = "Pete", LastName = "Luck", DateOfBirth = DateTime.Now.AddYears(-20), DateCreated = DateTime.Now.AddDays(1) } 
    }; 

    dbContext 
     .Setup(m => m.Students.Remove(It.IsAny<Student>())) 
     .Callback<Student>((entity) => students.Remove(entity)); 

    int idToDelete = 1; 

    dbContext 
     .Setup(s => s.Students.Find(idToDelete)) 
     .Returns(students.Single(s => s.StudentID == idToDelete)); 

    // call delete method now 
    studentService.Delete(idToDelete); 

    // 1 object deleted, it should return 1 
    Assert.AreEqual(1, students.Count()); 

    dbContext.Verify(s => s.Students.Find(idToDelete), Times.Once); 
    dbContext.Verify(s => s.Students.Remove(It.IsAny<Student>()), Times.Once); 
    dbContext.Verify(s => s.SaveChanges(), Times.Once); 
}