2009-10-15 24 views
5

Sto eseguendo un test di unità su una classe che utilizza il framework di iniezione di unità unity.Test unitario con ServiceLocator

Restituisce null: ServiceLocator.Current.GetInstance();

Come posso ottenere che restituisca un oggetto fittizio o solo l'oggetto stesso?

risposta

4

MSDN ha questo esempio che mostra how to implement the service locator pattern with Unity. In sostanza, dovresti passare l'oggetto locator del servizio come argomento costruttore della tua classe. Ciò consente di passare un MockUnityResolver, consentendo di assumere il controllo completo in un test di unità.

[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

Stai testando il tuo codice "DI integrazione" principale? In caso contrario, il tuo codice normale non dovrebbe mai (beh, raramente) interagire con il tuo framework DI.

Normalmente le vostre dipendenze verranno iniettate tramite l'iniezione del costruttore e, quando si esegue il test, è possibile fornire invece oggetti fittizi come tali dipendenze del costruttore. Per esempio:

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

Con il codice di cui sopra, si può semplicemente prendere in giro IBar, e passarlo al costruttore Foo.

4

Potresti utilizzare l'iniezione di Poor Man. Creare un costruttore predefinito che recuperi le dipendenze dal localizzatore del servizio e inoltrare tali dipendenze a un costruttore "reale" che le assuma come parametri. Questo si prende cura delle situazioni di produzione.

Quindi, quando si verifica la classe in questione, passare una versione falsa/fittizia delle dipendenze al costruttore "reale", ignorando del tutto quella predefinita.