Wie Moq Entity Framework SqlQuery ruft
Habe ich in der Lage zu verspotten DbSet
's von entity framework mit Moq mit dieser link.
Allerdings würde ich jetzt gerne wissen, wie ich konnte mock den Aufruf von SqlQuery. Nicht sicher, ob dies möglich ist oder wie es stützt sich auf die verspottet db-Kontext zu wissen, was "query" aufgerufen wird.
Unten ist das, was ich versuche zu verspotten.
var myObjects = DbContext.Database
.SqlQuery<MyObject>("exec [dbo].[my_sproc] {0}", "some_value")
.ToList();
Ich derzeit habe nicht versucht, etwas, das so nicht wussten, wie Sie beginnen, imitieren dieses Beispiel.
Den Spott der DbSet
unten und zu re-iterieren, kann ich richtig mock Rückkehr eine DbSet
von MyObject
's aber jetzt versuche, mich zu verspotten, ein SqlQuery, gibt eine Liste der MyObject
's.
var dbContext = new Mock<MyDbContext>();
dbContext.Setup(m => m.MyObjects).Returns(mockObjects.Object);
dbContext.Setup(m => m.Database.SqlQuery... something along these lines
InformationsquelleAutor David | 2014-09-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Datenbank.SqlQuery<T>
nicht markiert ist als virtuelle, aberSet<T>.SqlQuery
gekennzeichnet ist, die als virtuelle.Basierend auf
Datenbank.SqlQuery<T>
Dokumentationund
Set<T>.SqlQuery
Dokumentationdann die
Database.SqlQuery<T>(String, Object[])
sollte gleichwertig sein mitSet<T>.SqlQuery(String, Object[]).AsNoTracking()
(nur wennT
ist EF Einheit, nicht ein DTO /VM).Also, wenn Sie können, ersetzen Sie die Implementierung in:
können Sie verspotten es als Folgen
InformationsquelleAutor Yuliam Chandra
Den
Database
Eigentum undSqlQuery
Methode werden nicht markiert, wievirtual
so dass Sie kann nicht verspottet werden (mit Moq; Sie könnte ein andere Bibliothek , können für dieses Konto aber das kann mehr Trägheit, als man möchte).Müssten Sie benutzen eine Art der Abstraktion, dies zu umgehen, z.B. durch einwickeln der gesamten Abfrage der Datenbank in eine helper-Klasse:
Nun die Methode, die Sie testen wird:
Dann würden Sie injizieren die
IQueryHelper
im Konstruktor der Klasse, die Sie testen wollen und spotten, dass.Du wirst die fehlende Testabdeckung auf
DoYourQuery
, aber das jetzt die Abfrage so einfach ist es offensichtlich keine Mängel.InformationsquelleAutor Patrick Quirk
Können Sie eine virtuelle Methode, um Ihre Datenbank-Kontext, den Sie überschreiben können in unit-tests:
InformationsquelleAutor MichaelC
Sollte jemand kommen über diese. Ich löste dieses mit ein paar Ansätze. Nur ein weiterer Weg, um dies anzugehen.
Meinen Kontext abstrahiert über eine Schnittstelle. Ich brauche nur ein paar der Methoden:
}
Alle meine Datenbank-Zugriff über async-Methoden. Das bringt eine ganze Reihe neuer Probleme, wenn Sie versuchen, zu verspotten. Zum Glück - es wurde beantwortet hier. der Ausnahme, Die Sie bekommen, ist im Zusammenhang mit fehlenden mock für IDbAsyncEnumerable. Mit der bereitgestellten Lösung - ich erweiterte es ein bisschen mehr, so dass ich hatte einen Helfer, um wieder eine Mock> Objekt, verspottet alle Eigenschaften, die man erwartet.
Schließlich - mit der Lösung von @Yulium Chandra - mein Test des raw-SQL mit verspottet Kontext sieht wie folgt aus:
InformationsquelleAutor JBenn