2010-04-24 16 views
7

Kann es ohne den TypeMock Islator gemacht werden? Ich habe online ein paar Vorschläge gefunden, wie beispielsweise die Übergabe einer Nur-Metadaten-Verbindungszeichenfolge, aber nichts, was mir außer TypeMock begegnet ist, scheint tatsächlich einen Schein-ObjectContext zuzulassen, der in Dienste für Komponententests eingefügt werden kann. Werde ich den Preis für TypeMock ablehnen, oder gibt es Alternativen? Hat es niemand geschafft, etwas zu schaffen, das vergleichbar ist mit TypeMock, das Open Source ist?EF4 - möglich, ObjectContext für Komponententests zu verspotten?

+1

Ein Vorschlag, den ich gesehen habe, besteht darin, die Regeln zu brechen, die gegen die db getestet werden. Der Typ sagte, dass er CreateDatabase() verwendet, um lokal eine "Schein" -Db-Instanz zu erstellen. Im Allgemeinen möchte ich das vermeiden, da wir diese Regel bei einem früheren Projekt gebrochen haben und es nicht so gut geklappt hat. Es war in Ordnung bis zu ~ 600 Tests, aber am Ende mit> 2000 Tests war es völlig nutzlos für echte TDD und wir führten die Tests ab und zu im "Batch-Modus" (dauerte 5 Minuten oder mehr, um sie auszuführen). –

Antwort

4

Ich bin Unit-Test EF4 leicht ohne zu spotten. Was ich getan habe, war eine Repository-Schnittstelle mit dem Code von http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/ als Grundlage erstellen Ich habe dann eine InMemoryRepository<T> Klasse erstellt, die die IRepository Schnittstelle verwendet. Ich habe dann innerhalb der Klasse die durch eine List<T> ersetzt und die Retrieval-Methoden entsprechend geändert.

Wenn Sie also Komponententests durchführen müssen, übergeben Sie das InMemoryRepository und nicht das DataRepository.

+1

-1 Linq2Objects verhält sich anders als Linq2Entities. Ihre Tests werden möglicherweise gegen eine Liste bestehen, scheitern jedoch, wenn sie von EF in SQL geparst werden. –

+0

Es gibt keine Möglichkeit, ohne Zugriff auf die Datenbank bestanden zu werden, daher bin ich mir nicht sicher, was Ihr Standpunkt ist. Verspotten bedeutet nicht, dass Ihre Linq2Entities immer gültig sind und ordnungsgemäß funktionieren. – KallDrexx

+2

Erfassen Sie Ihre Abfragen und testen Sie sie anhand einer echten Datenbank. Dann verspotten Sie sie, wenn Sie Ihre Geschäftslogik testen. Daher ist jede Abfrage eine wiederverwendbare Komponente, von der Sie wissen, dass sie funktioniert. Und Ihre Geschäftslogik wird getestet, ohne dass eine Datenbank im erwarteten Zustand benötigt wird. –

1

Wickeln Sie den ObjectContext in eine Proxy-Klasse. Dann injiziere das in deine Klassen.

+0

Ja, ich habe das versucht, und es ist eine Möglichkeit - aber alle diese Ansätze mit Proxies haben ihre eigenen Grenzen. Linq funktioniert für eine Sache anders (Linq zu Objekten wird verwendet, gegenüber Linq zu Entitäten). –

+2

TRue, aber erwartet, dass Ihre Unit-Tests Unterschiede in verschiedenen Linq-Implementierungen aufgreifen, scheint bei Unit-Tests etwas übertrieben zu sein. Das mehr in der Integrationstest Arena, denkst du nicht? – SamuelWarren

3

Setzen Sie Ihre Linq2Entity-Abfrage hinter eine Schnittstelle, testen Sie sie isoliert gegen eine echte Datenbank.

Schreiben Sie Tests für Ihre Geschäftslogik mit Mocks für Ihre Query-Schnittstellen. Lass Linq nicht in deine Geschäftslogik eindringen!

Verwenden Sie nicht das RepositoryPattern!

0

Ich glaube nicht die Repository-Muster auf die Frage die einzige Antwort ist (es vermeidet das Problem, sicher)

ich diese Antwort mochte - ich glaube, besser geeignet für Tests zu einer bestehenden Code-Basis Creating Interface for ObjectContext

Einführung