2009-01-12 4 views

Antwort

0

Da Ihre Komponenten ihre eigenen Abhängigkeiten haben könnte oder eine Initialisierung ausführen ich würde dieses Szenario mit UTs abzudecken.

So etwas wie

iocContainer.Register(typeof(MyService1)); 
service = iocContainer.Get(typeof(MyService)); 
Debug.AssertNotNull(service); 
2

Im Frühjahr können Sie einen Komponententest, die einfach den anwendungs ​​Kontext lädt, ohne etwas zu behaupten. Es ist tatsächlich ein ziemlich nützlicher Test in Verbindung mit automatischem Build, da sich der Frühling über viele Probleme beim Laden des gesamten Kontexts beschwert.

0

I Windsor in einem ASP.NET MVC-Projekt bin mit dem ich einen einfachen Test geschrieben habe, um sicherzustellen, dass alle Controller instanziiert werden können (das heißt ihre Abhängigkeiten aufgelöst werden).

Ich habe einen Test für jede Konfiguration der Website (z. B. "Entwicklung", "Test", "SomeProductionSite" usw.), wo ich meinen Windsor-Container mit dieser bestimmten Konfiguration erstellen und alle nicht-abstrakten Implementierungen durchlaufen von IController, überprüft, dass ich eine Instanz von jedem auflösen kann.

Da die Controller Factory der einzige Eintrittspunkt in die Anwendung, die in einem container.Resolve (...) zur Folge haben wird, bin ich 100% sicher, dass alle Konfigurationen gültig sind.

Im Allgemeinen habe ich das Schreiben von Tests gefunden, die als Aussagen über das gesamte System funktioniert sehr nützlich sind und wertvoll.

z. Ich behaupte auch, dass alle Controller-Aktionen virtuell sind, was eine Voraussetzung ist, da ich Castles automatische Transaktionsverwaltung verwende, um Controller-Aktionen mit Transaktionen zu umgeben.

1

@aku, @krosenvold @mookid und ein überzeugendes Argument, zum Testen, dass die Konfiguration der Abhängigkeiten korrekt ist.
Ich glaube nicht, dass dies Einheit testing obwohl.
Was testen Sie? Sie versuchen nicht, den Container selbst zu testen (vermutlich handelt es sich dabei nicht um einen Code, den Sie geschrieben haben oder pflegen).
Was Sie testen möchten, ist, dass alle Abhängigkeiten eines bestimmten Typs erstellt werden können und dass der Typ aufgelöst werden kann. Dies klingt wie ein ziemlich nützlicher Systemtest oder Integrationstest in Ihrer Umgebung für kontinuierliche Integration.
Sobald Binärdateien den Komponententest bestehen, können Sie den Container erstellen und das Setup für den Container auf einem Computer ausführen, der Ihre Produktionsumgebung spiegelt und prüft, ob alle Typen, die der Container auflösen kann, tatsächlich ausgeführt werden können erstellt werden und alle ihre Abhängigkeiten können instanziiert werden.
Es wäre schön, dies in einer neuen VM auszuführen, auf die Sie Ihr aktuelles Installationsprogramm angewendet haben.

0

Es kann sinnvoll sein, da einige Dependency Injection-Frameworks (wie Unity) seltsame Regeln für die Wahl haben, die Konstruktor aufzurufen. Ich würde auf jeden Fall Unit Tests empfehlen, um sicherzustellen, dass die Registrierung und Erstellung Ihres Typs erfolgreich durchgeführt wird.

2

Es fühlt sich irgendwie falsch an, dass der IoC-Container in meinen Testprojekten läuft. Ich habe auch bemerkt, dass die meisten Bugs, die durch nicht aufgelöste Abhängigkeiten verursacht werden, durch die Auftragsabhängigkeiten verursacht werden. Dies ist sehr schwer richtig zu testen und ist nicht etwas, was ich als Komponententest machen möchte.

Normalerweise verwende ich Debug.Assert-Anweisungen in den Initialisierungsroutinen meiner Klassen. Dies gibt mir ein Frühwarnsystem für IoC-bezogene Fehler und hilft auch, Abhängigkeiten besser in meinem Code zu spezifizieren.

1

Was ich mit dem IoC-Container Guice mache, ist, dass ich zuerst die Klassen für einige Funktionen mit TDD ohne Guice erzeuge (das sind Komponententests). Dann erstelle ich mit Guice einen Integrationstest für dieses Feature. Zu diesem Zeitpunkt ist die IoC-Konfiguration (Guice-Modul) unvollständig, so dass der Integrationstest fehlschlägt. Mit TDD füge ich die IoC-Konfiguration Schritt für Schritt hinzu, bis der Integrationstest erfolgreich ist. Ich werde keine @Inject-Annotation, Zeile der Konfiguration oder Bereichsdeklaration hinzufügen, außer es ist erforderlich, einen Test zu bestehen. Daher werde ich Integrations- (oder Akzeptanz-) Tests durchführen, um sicherzustellen, dass die IoC-Konfiguration richtig und vollständig ist.

Die gleiche Methode sollte mit jedem IoC-Container oder einem anderen System funktionieren, dessen Konfiguration so komplex ist, dass es kaputt gehen kann - schreiben Sie keine Konfiguration, es sei denn, Sie müssen einen Test bestehen.

+0

P. S. In einigen Projekten schreibe ich auch Tests für die Build-Konfiguration, vor allem, wenn es einige komplexe Anforderungen gibt, wie zum Beispiel maven-shade-plugin. Hier ist ein Beispiel, wie ich es in einem Projekt gemacht habe: http://www.orfjackal.net/lets-code#jumi –