2017-08-10 1 views
0

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.

+0

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

+1

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

+0

@AndrewP, aktualisierten Code zu verspotten. Abwicklung durch Dependency-Injection. – Kenz

Antwort

1

Hier habe ich einige Änderungen zu entwerfen DbSet<>aktualisiert Funktionalität zu testen:

hinzugefügt unter meiner Kontextklasse folgenden Funktion:

public virtual void AddOrUpdateEntity<TEntity>(IProMetrixContext db, 
TEntity[] entities) where TEntity : class 
{ 
    db.Set<TEntity>().AddOrUpdate(entities); 
} 

und dann UpdatePreSchoolStudentAsync(Student student) Verfahren leicht verändert als:

public async Task<int> UpdateProMetrixRiskAsync(Student student) 
{ 
     PreSchoolContext.AddOrUpdateEntity<Student>(PreSchoolContext, student); //This one resolved issue of unit test and works fine in real scenario too. 
     var result = await PreSchoolContext.SaveChangesAsync().ConfigureAwait(false); 
     return result; 
} 

Hier erhalten Sie eine Referenz LINK

HINWEIS: Wenn jemand Vorschläge zu gleichen hat, bitte posten.

Verwandte Themen