Wie testen Sie die Abhängigkeitsinjektion?

8

Dependency-Injection hilft Ihnen, Ihren Code ziemlich gut zu testen. Aber wie testen wir, ob die richtigen Abhängigkeiten schließlich zur Laufzeit injiziert werden? Zum Beispiel habe ich eine Service-Klasse, die eine Liste von Service-Validatoren aufnimmt. Da die Liste der Validierer von einem DI-Container injiziert wird, wie stellen wir sicher, dass die richtigen Validatoren injiziert werden? Was passiert, wenn ein Entwickler versehentlich einen Validierer aus der Liste entfernt? Selbst wenn wir Tests zur Abhängigkeitsinjektion schreiben, können wir nicht auf alle Abhängigkeiten bestehen, ohne die Kapselung zu unterbrechen. Der einzige Weg ist ein Integrationstest, der das Validierungsverhalten des Dienstes bestätigt. Wenn das Dienstverhalten kompliziert ist, wird es schwierig, Integrationstests zu schreiben. Irgendwelche Ideen ??

    
uttamkini 06.08.2011, 15:46
quelle

1 Antwort

6

Um Ihre Frage zu paraphrasieren:

Ich habe die einzelnen Komponenten meiner Anwendung getestet und sie funktionieren alle. Aber woher weiß ich, dass die Anwendung als Ganzes funktioniert?

Gute Nachrichten

Überlegen Sie, wie gut Sie in einer Position sind, im Vergleich dazu, in der Lage zu sein, zu fragen:

Ich habe jetzt diesen ganzen Code geschrieben, woher weiß ich, ob die Anwendung funktioniert?

Sie haben Fehler im Komponententest gefunden und entfernt. Die Codierung in Abhängigkeitsinjektionsstilen machte Abhängigkeiten klar und entfernte die Abhängigkeit von globalen Variablen. Diese Techniken bedeuten, dass Sie weniger Bugs und insbesondere weniger Bugs haben, die sich nur dann zeigen, wenn die gesamte Anwendung zusammengestellt wird.

Test größer

Um nun Ihre Frage zu beantworten, könnten Sie einen automatisierten Test schreiben, um zu bestätigen, dass ein bestimmter Validator von Ihrem Dependency-Injektionscontainer zurückgegeben wird. Besser noch, ich bevorzuge schreiben Tests, die: -

  • Fragen Sie den DI-Container nach einem Objekt (hinter dem eine Grafik mit kollaborierenden Objekten liegt, z. B. eine Liste von Validatoren)
  • Bitten Sie das Objekt, seine Funktion auszuführen (validieren Sie diese Daten)
  • Bestätigen Sie das Ergebnis (z. B. Validierungsfehler)

Möglicherweise möchten Sie bestimmte Objekte, die auf die Datenbank zugreifen, die aktuelle Serverzeit, einen Webdienst usw. mit einem Testdoppel ersetzen. Dies ist einfach, weil Sie die Abhängigkeitsinjektion verwenden.

Wenn eine Klasse nicht besonders mühsam ist, versuche ich auf dieser Ebene zu testen, da sie mehr Tests erlaubt, das Refactoring zu überleben. Klassen mit einer zyklomatischen Komplexität von 1 erfordern kein eigenständiges Testen, wenn sie als Teil eines größeren Tests ausgeführt werden. Klassen mit höherer zyklomatischer Komplexität können.

Viele Tests, aber funktioniert es?

Auch dann fragen Sie sich vielleicht, Aber funktioniert die ganze Sache?

Um diese Frage zu beantworten, müssen Sie die Anwendung in ihrer endgültigen Form testen. Für eine Webanwendung bedeutet dies, dass sie auf einem richtigen Server mit einer geeigneten Datenbank und der echten Firewall usw. bereitgestellt wird. Dann können Sie mit etwas wie Selenium manuell testen oder testen.

Fehler beim Eingeben der richtigen Abhängigkeiten würden zu einem katastrophalen Fehler bei dem Feature führen, das die injizierte Komponente ausführen soll. Es ist nicht notwendig, jede Kombination zu testen, sondern nur leicht auf jede Komponente zu tippen.

    
WW. 07.08.2011 09:09
quelle