2012-05-25 20 views
5

Estoy familiarizado con el hecho de que no debo usar la inyección de dependencia en pruebas unitarias, por lo que puedo probar cada capa de manera independiente.Prueba de integración con Ninject

Aún así, quiero crear pruebas de integración para mis controladores. Por lo tanto, necesito inyectar mis repositorios en los Controladores desde una prueba unitaria.

I siguiendo un enfoque genérico utilizando un script T4, que crea una clase de prueba para cada controlador, que contiene un método de prueba para cada resultado de acción. Este método de prueba simplemente debe llamar al método para asegurarse de que no se lanzan excepciones a la superficie.

Debido al uso de este script T4, no puedo alimentar manualmente los repositorios en los controladores. Necesito hacer uso de la inyección de dependencia.

Con base en mi experiencia anterior, esto debería funcionar, pero aparece el error:

Unable to get default constructor for class <<UnitTest>> 

Mis clases generadas tener este aspecto en la actualidad

[TestClass] 
public class TestControllersHomeController 
{ 
    private EL.NET.Web.Controllers.HomeController c; 
    //setup 
    public TestControllersHomeController(Project.Controllers.HomeController c) 
    { 
     this.c = c; 
    } 
    [ClassInitialize] 
    public void ClassInitialize() 
    { 

     var kernel = NinjectWebCommon.CreatePublicKernel(); 
     kernel.Bind<TestControllersHomeController>().ToSelf(); 
     kernel.Bind<Project.Controllers.HomeController>().ToSelf(); 
    } 
    [TestMethod] 
    public void TestIndex() 
    { 
     var result = c.Index(); 
     Assert.IsNotNull(result); 
    } 

Editar:

Ya descubrí que los repositorios se pueden cargar con la ayuda del método GetService() de IKernel. Pero para el proveedor de membresía, esto no funciona. De nuevo, no quiero burlarme del proveedor, quiero realizar una prueba de integración para saber si los métodos de mi Controlador arrojan alguna excepción.

Respuesta

4

La unidad de prueba debe tener un constructor por defecto: Uso

[TestClass] 
public class TestControllersHomeController 
{ 
    private HomeController _sut; 

    [TestInitialize] 
    public void MyTestInitialize() 
    { 
     var kernel = NinjectWebCommon.CreatePublicKernel(); 
     _sut = kernel.Resolve<HomeController>(); 
    } 

    [TestMethod] 
    public void TestIndex() 
    { 
     var result = _sut.Index(); 
     Assert.IsNotNull(result); 
    } 
} 
+0

El método no genérico 'Ninject.Syntax.IResolutionRoot.Resolve (Ninject.Activation.IRequest)' no se puede utilizar con argumentos de tipo – ckonig

+0

@ckonig el método de extensión 'Get ' en lugar de Resolver. Así que la llamada 'kernel.Get ();' debería funcionar y no olvides agregar 'using Ninject;' – nemesv

+0

Lo que funcionó para esta situación específica fue el método GetService() de IKernel. Ahora estoy luchando para resolver el Proveedor de membresía personalizado – ckonig

Cuestiones relacionadas