Ich schreibe Komponententests, um Änderungen am Save DbSet zu testen. Code wie folgt aussieht:Fehler beim MOCK DbSet, um die Update-Funktion für die zugrunde liegenden Entitäten zu testen
PreSchoolContext
DbSet<Student> Students{get;set;}
PreSchoolRepository
EDIT: PreSchoolContext ist nun ein IPreSchoolContext Beispiel durch Dependency Injection behandelt.
public async Task<int> UpdatePreSchoolStudentAsync(Student student)
{
PreSchoolContext.Set<Student>().AddOrUpdate(student);
var result = await PreSchoolContext.SaveChangesAsync().ConfigureAwait(false);
return result;
}
Test Method
//Arrange
var data = GetStudents().AsQueryable();
var mockSet = new Mock<DbSet<Student>>();
mockSet.As<IQueryable<Student>>().Setup(m => m.Provider).Returns(new TestDbAsyncQueryProvider<Student>(data.Provider));
mockSet.As<IQueryable<Student>>().Setup(m => m.Expression).Returns(data.Expression);
var preSchoolContextMock = new Mock<IPreSchoolContext>();
preSchoolContextMock.Setup(c => c.Students).Returns(mockSet.Object);
var repo = new PreSchoolRepository(preSchoolContextMock.Object);
//Act
var preSchoolStudentUpdateFlag = await repo.UpdatePreSchoolStudentAsync(data.FirstOrDefault());
//Assert
preSchoolStudentUpdateFlag.ShouldNotBeNull();
preSchoolStudentUpdateFlag.ShouldBe(1);
Fehler
kann nicht öffentlichen, Instanzmethode AddOrUpdate auf abgeleitet IDbSet Typ 'Castle.Proxies.DbSet`1Proxy' nennen. Methode nicht gefunden
Nicht zu verstehen, was fehlt, um die Mock-Daten korrekt zu setzen.
Warum bestehen wir darauf, einen Code zu testen, den wir nicht kontrollieren können? MS hätte ihren Code getestet, bevor er veröffentlicht wurde. Das heißt, Ihre zu testende Methode ist zu eng gekoppelt, um das isolierte Testen zu einem sinnvollen Zweck zu machen. – Nkosi
Das Problem ist, dass Ihre Klasse einen echten "PreSchoolContext" verwendet, indem Sie sie neu erstellen. Sie müssen eine Art der Abhängigkeitsinjektion haben, um den dbcontext – AndrewP
@AndrewP, aktualisierten Code zu verspotten. Abwicklung durch Dependency-Injection. – Kenz