2009-10-15 15 views

Odpowiedz

4

MSDN ma ten przykład, który pokazuje how to implement the service locator pattern with Unity. Zasadniczo powinieneś przekazać obiekt lokalizatora usług jako argument konstruktora twojej klasy. Umożliwia to przekazanie MockUnityResolver, co pozwala na pełną kontrolę podczas testu jednostkowego.

[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

Czy testujesz swój podstawowy kod "DI integracja"? Jeśli nie, twój normalny kod nigdy nie powinien (dobrze, rzadko) wchodzić w interakcje z twoją strukturą DI.

Zwykle twoje zależności będą wstrzykiwane za pomocą wstrzyknięcia konstruktora, a podczas testowania możesz zamiast nich dostarczać symulowane obiekty jako zależności konstruktora. Na przykład:

public class Foo { 
    public Foo (IBar bar) { 
     bar.Lift(); 
    } 
} 

Powyższy kod można po prostu wyśmiać IBar i przekazać go konstruktorowi Foo.

4

Można wykorzystać zastrzyk ubogiego człowieka. Utwórz domyślny konstruktor, który pobiera zależności z lokalizatora usługi i przekazuje te zależności do "prawdziwego" konstruktora, który przyjmuje je jako parametry. To dba o sytuacje produkcyjne.

Następnie, testując daną klasę, wprowadź fałszywą/symulacyjną wersję zależności do "prawdziwego" konstruktora, omijając domyślnie jeden z nich.

Powiązane problemy