2009-10-15 33 views
5

Estoy haciendo una prueba unitaria en una clase que utiliza el marco de inyección de dependencia de unidad.Pruebas unitarias con ServiceLocator

Esto devuelve nulo: ServiceLocator.Current.GetInstance();

¿Cómo puedo obtener que devuelva un objeto falso o solo el objeto mismo?

Respuesta

4

MSDN tiene este ejemplo que muestra how to implement the service locator pattern with Unity. Básicamente, debe pasar el objeto localizador de servicio como un argumento constructor de su clase. Esto le permite pasar un MockUnityResolver, lo que le permite tomar el control total en una prueba unitaria.

[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

¿Está probando su código central de "integración DI"? De lo contrario, su código normal nunca debería (muy, rara vez) interactuar con su marco DI.

Normalmente, sus dependencias se inyectarán a través de la inyección de constructores, y cuando se prueban, en su lugar puede suministrar objetos simulados como esas dependencias de constructor. Por ejemplo:

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

Con el código anterior, simplemente puede burlarse de IBar y pasarlo al constructor de Foo.

4

Puede utilizar la inyección de Poor Man. Cree un constructor predeterminado que recupere las dependencias del localizador de servicios y reenvíe esas dependencias a un constructor "real" que las tome como parámetros. Eso se ocupa de las situaciones de producción.

Luego, cuando pruebe la clase en cuestión, pase una versión falsa/simulada de las dependencias al constructor "real", omitiendo por completo el valor predeterminado.