2009-05-12 5 views

Antwort

3

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.
3

Ich bin nicht sicher, welche Artikel Sie beziehen, aber ich habe normalerweise ein Mock-Objekt pro Abhängigkeit für die Klasse im Test.

+0

"Die Kunst der Komponententests" sagt genau das. Testen Sie nur eine Sache pro Test, wann immer das, was eine Sache bedeutet, nicht klar ist. –

5

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.
+0

+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. –

+0

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

+0

@ 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. –

Verwandte Themen