Ich habe viele Artikel über Komponententests gelesen. Die meisten Artikel sagten, dass wir nicht mehr als ein Mock-Objekt in einem Test verwenden sollten, aber ich kann nicht verstehen warum. Manchmal brauchen wir wirklich mehr als ein Mock-Objekt in einem Test.Können wir mehr als ein Mock-Objekt in einem Komponententest verwenden?
Antwort
Sie sollten so viele Mocks wie nötig hinzufügen, um Ihre zu testende Klasse zu isolieren. Sie benötigen eine Kopie für jede Abhängigkeit, die nicht Teil des Tests sein sollte.
Manchmal fügen Sie der Einfachheit halber zwei oder drei Klassen in einem Test zusammen, weil sie so etwas wie eine Komponente aufbauen und stark gekoppelt sind. Alles andere sollte verspottet werden.
Ich kenne diese "Best Practice", um nur einen Schein zu haben und auch nicht zu verstehen. In unseren Komponententests haben wir viele Mocks, einige Umweltmocks werden von dem von mir geschriebenen Testframework eingerichtet (zB TransactionService, SecurityService, SessionService). Es gibt nur eine Sache zu beachten, wie Gishu bereits in seiner Antwort erwähnt, viele Mocks sind ein Hinweis auf hohe Abhängigkeit. Es liegt an Ihnen zu prüfen, wann es zu viel ist. Wir haben viele kleine Schnittstellen, die in Tests viele Mocks erfordern.
Ihre Antwort wenden, sollten Sie nicht mock eine Abhängigkeit, wenn:
- Es ist ein hoch gekoppelt Teil der Klasse unter Test, wie eine innere Klasse, private Klasse usw.
- Es ist eine gängige .NET-Framework-Klasse wie eine Collection und dergleichen
- Sie möchten einen Integrationstest schreiben, um genau die Interaktion mit dieser Klasse zu testen. (Sie verspotten immer noch alles andere und Sie haben immer noch Unit-Tests für jede beteiligte Klasse isoliert.)
- Es ist einfach zu teuer, eine bestimmte Klasse zu verspotten. Sei vorsichtig mit der Entscheidung, dass es zu teuer ist, Mocks scheinen schwer einzurichten zu sein, aber erweisen sich als ein Kinderspiel im Vergleich zu den Wartbarkeitsproblemen, die du mit echten Klassen haben wirst. Aber es gibt einige Frameworks und Technologien, die nicht gegen Schnittstellen implementiert werden und sehr schwer zu verspotten sind. Wenn es zu teuer ist, diese Framework-Klassen hinter Ihre eigene Schnittstelle zu stellen, müssen Sie in den Tests mit ihnen leben.
Ich bin nicht sicher, welche Artikel Sie beziehen, aber ich habe normalerweise ein Mock-Objekt pro Abhängigkeit für die Klasse im Test.
Je nach Kontext können mehrere Tests in einem Komponententest verwendet werden.
Aber ich denke, was die Artikel "anspielend könnte bei
ist- Prävention von über spöttisch. Wenn ein Komponententest alle Mitarbeiter verspottet, lässt du die Tür offen; Das Szenario schlägt möglicherweise fehl, wenn Sie echte Mitarbeiter ersetzen. Indem Sie die Anzahl der Mocks minimieren und echte Mitarbeiter so weit wie möglich/möglich einsetzen, minimieren Sie dieses Risiko.
- Hohe Kopplung Warnungen: Wenn Sie feststellen, dass Sie viele Mitbearbeiter verspotten müssen, um einen Komponententest zu schreiben, könnte es ein Designgeruch sein, der anzeigt, dass Sie eine hohe Kopplung haben.
+1 für den Kopplungshinweis.Aber ich würde nicht vorschlagen, "echte Kollaborateure" zu verwenden, nur um die Anzahl der Mocks zu reduzieren. Manchmal testeest du mehrere Klassen zusammen, weil sie stark gekoppelt sind und eine Komponente bilden. Aber alles draußen sollte so gut wie möglich isoliert werden. Wenn Sie feststellen, dass Sie zu viele Mocks haben, haben Sie ein Kopplungsproblem. Dann solltest du umgestalten. –
Ich empfehle 'echte' Mitarbeiter nicht für die Reduzierung der Anzahl der Mocks .. aber um den Test-Spiegel realen Weltbetrieb zu machen. Damit vermeiden Sie den Fall, dass Ihr Test bestanden wird, weil Sie mit einer Reihe von Mock-Objekten gespielt haben. In der realen Welt funktioniert es jedoch nicht, weil eine der Abhängigkeiten sich nicht wie der entsprechende Mock verhält. Wenn der Kollaborateur den Komponententest nicht verlangsamt, ist das Erstellen einer Schnittstelle an der Grenze und dann das Verwenden eines Mocks Overkill. – Gishu
@ Gishu: Ich stimme nicht zu. Sprüche dienen der Isolation, nicht der Geschwindigkeit. Sie müssen den zu testenden Code so gut wie möglich isolieren, das ist wie ein Labortest in der Chemie, Sie vereinfachen die Umgebung, um einen einzelnen Prozess zu isolieren. Dann können Sie beweisen, was der Prozess bewirkt, unabhängig von einer unbekannten Umgebung. Spott sollte trivial und daher überschaubar sein. Andere Klassen sind ein anderes unbekanntes. Was Sie tun, ist ebenfalls wichtig, aber es ist ein Integrationstest, den Sie durchführen sollten, nachdem Sie bewiesen haben, dass sich die einzelnen Klassen gemäß den Spezifikationen verhalten. –
- 1. django können wir ein Feld in einem Prefetch-Modell verwenden?
- 2. Können wir Blackberry als GSM-Modem verwenden?
- 3. Können wir Komponententest für AngularJS routeProvider schreiben?
- 4. Können wir Komponententest für AngularJS routeProvider schreiben?
- 5. Warum können wir 'this' als Instanzmethodenparameter verwenden?
- 6. Können wir & in URL verwenden?
- 7. können wir mehr als ein Knoten Label in einzelnen NodeSelector in Kubernetes
- 8. Wie können wir verbessern! in einem Befehl als Variable?
- 9. Können wir in Mapreduce den Combiner als Ersatz verwenden?
- 10. Wie können wir Array-Elemente als Zähler in Java verwenden?
- 11. Können wir Funktion als Return-Anweisung in Javascript verwenden?
- 12. Können wir mehr als ein Feld in g haben: Wählen Sie OptionValue?
- 13. Können wir SpanNearQuery im phonetischen Index verwenden?
- 14. Verwenden Sie mehr als ein SurfaceTexture auf einem Shader
- 15. Können wir Voreinstellungen in einer mehr Aktivitäten Mitbenützung
- 16. Können wir ember-cli rein als Frontend verwenden wie wir javascript und jquery verwenden?
- 17. Können wir ein Array initialisieren, wenn wir es mit einem Strukturobjekt verwenden? | C#
- 18. Wie können wir AWS Kinesis in einem Webbrowser verwenden?
- 19. Können wir Quantifizierer in einem Lookbehind-Ausdruck verwenden?
- 20. Verwenden eines Initialisierers in einem Komponententest?
- 21. Wie funktioniert ein NetworkStream in einem Komponententest?
- 22. Können wir den Vererbungsinhalt in Sitecore verwenden?
- 23. Können wir ein vorhandenes Build-Skript in Teamcity verwenden?
- 24. Warum können wir C-Strings nicht als SELs verwenden?
- 25. Können wir Regex in Symfony2 Zugriffskontrolle verwenden?
- 26. in netty, können wir nur Daten schreiben und empfangen weniger als 1024bytes: wie können wir mehr schreiben oder erhalten?
- 27. auf mehr als ein Anwendungsserver
- 28. Können wir die neue BottomNavigationBar als temporäre Snackbar verwenden?
- 29. Warum verwenden wir pthread_exit(), wenn wir return verwenden können?
- 30. Können wir ein anderes Makefile in ein GNU-Makefile aufnehmen, indem wir den relativen Pfad verwenden?
"Die Kunst der Komponententests" sagt genau das. Testen Sie nur eine Sache pro Test, wann immer das, was eine Sache bedeutet, nicht klar ist. –