Wie wird ObjectContext oder ObjectQuery gespielt? in Entity Framework?

.net-3.5 entity-framework mocking unit-testing

Frage

Wie wird ObjectContext oder ObjectQuery in Entity Framework gespielt?

Beliebte Antwort

Die grundlegenden Mocking-Frameworks können nur Mocks für Schnittstellen und für abstrakte Klassen erstellen (jedoch nur für abstrakte / virtuelle Methoden).

Da es sich bei ObjectContext weder um eine abstrakte noch um eine Schnittstelle handelt, ist es nicht so einfach, sich darüber lustig zu machen. Da der konkrete Modellcontainer jedoch als Teilklasse generiert wird (wenn Sie den Designer verwenden), können Sie die benötigten Methoden / Eigenschaften daraus in eine Schnittstelle extrahieren. In Ihrem Code dürfen Sie nur die Schnittstelle verwenden, die Sie anschließend nachahmen können.

Mit ObjectQuery ist es etwas einfacher, da es über eine Basisschnittstelle (z. B. IQueryable) verfügt, die im Wesentlichen alle erforderlichen Operationen enthält, die Sie normalerweise benötigen (und die für LINQ erforderlich sind). Sie sollten also IQueryable anstelle von ObjectQuery in Ihrer Geschäftslogik verfügbar machen, und Sie können Mock für diese Schnittstelle erstellen.

Eine andere Alternative besteht darin, die gesamte auf den Datenzugriff bezogene Logik in einer separaten Schicht (mit minimaler Logik) zu verbergen, diese Schicht mit Integrationstests zu testen und sie zu simulieren, um die anderen Schichten als Einheitstest testen zu können.

Es gibt Tools (ich kenne nur TypeMock ), die die Profiling-Hooks von .NET verwenden, um die Mocks zu generieren. Diese Tools sind nicht auf Scheinschnittstellen oder abstrakte Klassen beschränkt, sondern mit ihnen können Sie im Grunde alles simulieren, einschließlich nicht virtueller und statischer Methoden. Mit einem solchen Tool müssen Sie Ihre Geschäftslogik nicht ändern, um Spott zuzulassen.

Obwohl dieser Ansatz manchmal nützlich ist, müssen Sie wissen, dass das Extrahieren der Abhängigkeiten zu Schnittstellen (IoC) nicht nur für das Spotting hilfreich ist, sondern auch die Abhängigkeiten zwischen Ihren Komponenten reduziert, was auch andere Vorteile mit sich bringt.

Ich persönlich mag Rhino.Mocks am besten von den Freeware-Tools, aber wir verwenden auch TypeMock , das auch ein tolles Produkt ist (aber man muss dafür bezahlen).



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum