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 ??
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: -
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.
Tags und Links unit-testing dependency-injection