Neulich habe ich ein wenig über Unit Testing gelesen und einige Beispiele gesehen, in denen Leute eine Repository-Schnittstelle (dh IExampleRepository
) erstellen und dann das echte Repository ( public class ExampleRepository : IExampleRepository
) und ein Repository für Unit-Tests ( FakeExampleRepository : IExampleRepository
) erstellen .
In der IExampleRepository
implementierten sie die gleichen Methoden wie in der ExampleRepository
, jedoch mit unterschiedlichen Linq-Abfragen.
Was genau ist hier das Ziel? Ich dachte, ein Teil des Unit-Tests Ihres Codes besteht darin, sicherzustellen, dass eine Methode korrekt funktioniert. Aber wie viel Sinn macht der Test, wenn ich zwei völlig unterschiedliche Abfragen verwende, eine für "echt" und eine im Test?
ExampleRepository
, ist es am besten, ein Modell zu verwenden. Die Rechtfertigung ist, dass Sie nicht das Repository testen, sondern etwas anderes.ExampleRepository
, verwenden Sie das Original . Wenn Sie Unit-Tests durchführenRepositoryController
, sollte nur a verwendet werdenFakeExampleRepository
, das vorgegebene Werte zurückgibt. Auf diese Weise, wenn ein Fehler einschleicht zuExampleRepository
, nur dass Unit - Test fehl -RepositoryController
‚s - Tests werden auch weiterhin erfolgreich zu sein , so dass Sie wissen , dass es nicht um einen Fehler gibt. Wenn der Controller das echte Repository verwenden würde, würden beide fehlschlagen und Sie würden nicht wissen, ob Sie 1 oder 2 Fehler hatten.Ich stimme den beiden Antworten von jk zu. und Jan Hudec - sie geben einige wirklich gute Informationen. Aber ich dachte, ich würde ein bisschen hinzufügen.
Ihre erste Frage ("Was genau ist das Ziel hier?") Ist wichtig. In dem von Ihnen beschriebenen Fall besteht das eigentliche Ziel darin, die Klassen zu testen, die die
IExampleRepository
Schnittstelle verwenden, und nicht die Repository-Implementierungen. Durch das Erstellen vonFakeExampleRepository
können Sie diese Clientklassen testen, ohne sich um die Details der realen Repository-Klasse kümmern zu müssen.Dies gilt insbesondere dann, wenn das Objekt, das Sie einrichten möchten, das Testen erschwert (z. B. Zugriff auf das Dateisystem, Aufruf eines Webservices oder Kommunikation mit einer Datenbank). Durch die Verwendung von Schnittstellen (und anderen derartigen Techniken) halten Sie die Kopplung niedrig. Daher muss die Klasse
X
nur über die Schnittstelle und nicht über die Implementierungsdetails Bescheid wissen. Das Ziel ist es sicherzustellen, dass die KlasseX
das Richtige tut.Das Verspotten (oder Stubben, Fälschen ... es gibt nuancierte Unterschiede) ist ein leistungsstarkes Werkzeug für Unit-Tests und TDD. Es kann jedoch schwierig sein, diese Implementierungen manuell zu erstellen und zu warten. Daher haben die meisten Sprachen jetzt verspottete Bibliotheken, um zu helfen. Da Sie C # verwenden, würde ich Moq empfehlen, da es einfach und sehr leistungsfähig ist. Anschließend können Sie die Schnittstelle testen, ohne zusätzlichen Code für die Scheinimplementierungen zu stapeln.
quelle
the real objective is to test the classes that are utilizing the IExampleRepository interface
das ist nicht unbedingt wahr. Ziel ist es, es unabhängig vom IExampleRepository zu testen . +1 für die Empfehlung eines guten Isolationsrahmens.IExampleRepository
da die zu testende Klasse an diese Schnittstelle gekoppelt ist. Es ist jedoch unabhängig von Implementierungen der Schnittstelle. Ich gebe zu, dass meine Erklärung wahrscheinlich etwas mehr Finesse gebrauchen könnte. :)Isolation.
Die Idee einer Einheit testet die kleinstmögliche zu testen Einheit des Codes. Sie tun dies, indem Sie es von allen anderen Produktionscodes im Test isolieren .
Durch das Erstellen gefälschter Klassen ist der einzige Produktionscode die zu testende Klasse.
Wenn Sie ein gefälschtes Repository ordnungsgemäß erstellen und der Test fehlschlägt, wissen Sie, dass das Problem beim zu testenden Code liegt. Dies gibt Ihnen den Vorteil einer kostenlosen Diagnose.
Schauen Sie sich Isolations-Frameworks an (wie Moq, wie von @Allan vorgeschlagen), um diese Fälschungen schnell zu generieren, um Testbedingungen einzurichten und sie zur Durchsetzung zu verwenden.
quelle
Es gibt drei Gründe, warum Sie möglicherweise eine Scheininstanz für den Komponententest bereitstellen möchten:
quelle