Frage

Ich habe ein paar Repository -Kurse, die mit verschiedenen Arten von Daten sprechen sollen, die von einem abgeleitet werden IRepository Schnittstelle.

In den Implementierungen spricht der Code mit einer Datenquelle, so ein Verzeichnis von XML -Dateien oder einer Datenbank oder sogar nur einem Cache. Ist es möglich, eine dieser Implementierungen zuverlässig zu testen? Ich sehe keine Mock -Implementierung, da ich dann nur den Mockcode und nicht den tatsächlichen Code teste.

War es hilfreich?

Lösung

Nein, Sie würden ein Schein verwenden, wenn Sie eine Klasse geschrieben haben, die Verwendet ein IRepository. Für die Implementierungen von IRepository, Sie müssten gegen die entsprechende Datenquelle testen. Für Datenbanken ist das ein bisschen Schmerz - für ein Dateisystem, etwas weniger.

Wenn Sie Ihre Implementierung in Bezug auf Streams oder Leser ausdrücken können, erleichtern Sie Ihr Leben: Tests für diese Teile der Implementierung können gegen Datenquellen für In-Memory oder Streams von Ressourcen in der Testbaugruppe verstoßen. Natürlich brauchen Sie wahrscheinlich wahrscheinlich etwas Tests, die in eine echte Datenbank oder das Dateisystem gehen, aber hoffentlich weniger.

Ob Sie solche Tests "Einheit" -Tests aufrufen oder nicht, ist eine Frage, wie Sie Unit -Tests definieren. Persönlich ist mir nicht zu sehr die Namen, aber ich tun kümmert sich um Tests. Insbesondere für Datenbanken können diese etwas schmerzhaft sein (insbesondere wenn Sie in der Lage sein möchten, Tests parallel durchzuführen) - aber nach meiner Erfahrung können sie auch unglaublich wertvoll sein.

Andere Tipps

Ich denke, wenn Sie Code testen, der tatsächlich Daten anhält oder abfragt, möchten Sie wahrscheinlich tatsächlich eine Datenbank schlagen.

Dies sind Integrationstests anstelle von Unit -Tests.

Sie können eine Testdatenbank einrichten, in der Sie den Status der Daten kennen und die Tests dagegen ausführen. Sie möchten wahrscheinlich auch die Tests mitteilen, dass sie sich von Ihren Unit -Tests unterscheiden und nicht bei jedem Check -in ausgeführt werden müssen (in Nunit können Sie Ihre Testklasse mit einem Attribut dekorieren, das es nicht ausführen soll)

Im Großen und Ganzen werden Sie nicht Einheit Testen Sie jeden Code, dessen einziger Zweck es ist, mit einer Datenquelle zu sprechen. Möglicherweise möchten Sie das Repository automatisch testen, ein solcher Test ist jedoch per Definition ein Integrationstest. Sie möchten diese Tests wahrscheinlich nicht als Teil Ihres "ersten Pass" -Bausbaus als z. B. die Datenbank einrichten und aufräumen, nachdem Sie sich selbst aufräumen können.

Wenn Ihr Repository andere Verantwortlichkeiten hat (z. B. die Implementierung des Arbeitsgeschäfts), möchten Sie möglicherweise die Einheiten separat testen.

Irgendwann in der Implementierung des Irepository verwenden Sie eine API von Drittanbietern, die tatsächlich zu/von Datenbank/Datei/XML liest/schreibt. Sie möchten diese APIs verspotten, um sicherzustellen, dass Ihr Code die richtige API in der richtigen Reihenfolge aufruft.

Wenn Sie also aus der Datenbank lesen, können Sie SQLConnection und SQLCommand verspotten und sicherstellen, dass Sie die richtigen Methoden in diesen Klassen aufrufen. Wenn Sie in einen Stream schreiben, können Sie den Stream verspotten und sicherstellen, dass Sie ihn spülen und (zum Beispiel) entsorgen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top