DBSet, EF-Modell zuerst verspotten

Wie im Titel erwähnt, folge ich der Model First-Methode. Meine Modellklassen werden also automatisch generiert. Wenn ich das verspotten willDBContext abgeleitetMyModelContainer welche enthaltenDBSets von Entitätsklassen. Lesen Sie einige Stellen, an denen dies geändert werden muss, um einen Komponententest durchzuführenIDBSet. Es ist ein Problem, ob dies insbesondere in einer Klasse möglich ist, die beim Ausführen des benutzerdefinierten Tools automatisch generiert wird. Aber jetzt habe ich es geändert.

Aber das eigentliche Problem ist: Wenn ich es versuche, StubMyModelContainer einen Schein zurückgeben, der von erzeugt wurdeIDBSet. Rhino-Mock löst eine InvalidOperationException aus: "Ungültiger Anruf, der letzte Anruf wurde verwendet oder es wurde kein Anruf getätigt (stellen Sie sicher, dass Sie eine virtuelle (C #) / überschreibbare (VB) Methode aufrufen."

Hier ist mein Unit-Test-Code.

MyModelContainer dbMock = MockRepository.GenerateMock<MyModelContainer>();
IDBSet<Models.MyEntity> entityMock = MockRepository.GenerateMock<IDBSet<Models.MyEntity>>()
dbMock.Stub( x=>x.MyEntities ).Return( entityMock );

Die letzte Anweisung löst die Ausnahme aus. Ich habe versucht, die gefälschte Implementierung von zu verwendenIDBSet<> spezifiziertenHierAber kein Glück!

Ich benutze MVC 4, Rhino Mocks 3.6. Jede Hilfe wird geschätzt.

Aktualisieren:

Nach einigen Versuchen und Nachforschungen fand ich eine Lösung. Ich habe den Code geändert in:

MyModelContainer dbMock = MockRepository.GenerateMock<MyModelContainer>();
IDBSet<Models.MyEntity> entityMock = MockRepository.GenerateMock<IDBSet<Models.MyEntity>>()
//dbMock.Stub( x=>x.MyEntities ).Return( entityMock );
dbMock.MyEntities = entityMock;

Jetzt dieInvalidOperationException ist weg. Der Test schlägt nur wegen fehlExpectationViolationException das sollte normal sein.

Bei der automatisch generierten Modellklasse wurde festgestellt, dass beim Bearbeiten derDbContext's T4-Vorlage (Erweiterung .tt) werde den Trick machen. Dank anAlans Blog

Aber ich möchte wissen, warum der vorherige Code nicht funktioniert hat. Jemand?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage