2009-10-15 7 views
5

Ich mache einen Komponententest für eine Klasse, die das Injection-Framework für die Einheitsabhängigkeit verwendet.Komponententest mit ServiceLocator

Dies gibt null zurück: ServiceLocator.Current.GetInstance();

Wie kann ich ein Mock-Objekt oder nur das Objekt selbst zurückgeben?

Antwort

4

In diesem Beispiel zeigt MSDN how to implement the service locator pattern with Unity. Im Wesentlichen sollten Sie das Service-Locator-Objekt als Konstruktorargument Ihrer Klasse übergeben. Dies ermöglicht Ihnen, eine MockUnityResolver zu übergeben, so dass Sie die volle Kontrolle in einem Komponententest nehmen können.

[TestMethod] 
public void InitCallsRunOnNewsController() 
{ 
    MockUnityResolver container = new MockUnityResolver(); 
    var controller = new MockNewsController(); 
    container.Bag.Add(typeof(INewsController), controller); 
    var newsModule = new NewsModule(container); 

    newsModule.Initialize(); 

    Assert.IsTrue(controller.RunCalled); 
} 
1

Testen Sie Ihren Kerncode "DI integration"? Wenn nicht, sollte Ihr normaler Code niemals (sehr, sehr selten) mit Ihrem DI-Framework interagieren.

Normalerweise werden Ihre Abhängigkeiten über die Konstruktorinjektion injiziert, und beim Testen können Sie stattdessen Mock-Objekte als Konstruktorabhängigkeiten angeben. Zum Beispiel:

Mit dem obigen Code können Sie einfach IBar spotten und es an den Foo-Konstruktor übergeben.

4

Sie könnten die Injektion von Poor Man verwenden. Erstellen Sie einen Standardkonstruktor, der die Abhängigkeiten vom Service-Locator abruft und diese Abhängigkeiten an einen "echten" Konstruktor weiterleitet, der sie als Parameter akzeptiert. Das sorgt für Produktionssituationen.

Dann übergeben Sie beim Testen der fraglichen Klasse eine falsche/falsche Version der Abhängigkeiten an den "echten" Konstruktor und umgehen Sie den Standard.

Verwandte Themen