2012-05-25 19 views
5

Jestem zaznajomiony z faktem, że nie powinienem używać iniekcji zależności w testach jednostkowych, więc mogę testować każdą warstwę osobno.Test integracji z Ninject

Nadal chcę utworzyć testy integracji dla moich kontrolerów. Dlatego muszę wstrzyknąć moje repozytoria do Kontrolerów z testu jednostkowego.

Podążam za ogólnym podejściem przy użyciu skryptu T4, który tworzy klasę testową dla każdego kontrolera, zawierającą metodę testową dla każdego ActionResult. Ta metoda testowa powinna po prostu wywołać metodę, aby upewnić się, że nie są zgłaszane żadne wyjątki na powierzchnię.

Z powodu użycia tego skryptu T4, nie mogę ręcznie podawać repozytoriów do kontrolerów. Muszę skorzystać z iniekcji zależności.

podstawie mojego dawnego doświadczenia, powinno to działać, ale wciąż otrzymuję błąd:

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

moich wygenerowanych klas wyglądać tak w tej chwili:

[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); 
    } 

Edit:

Już się dowiedziałem, że repozytoria mogą być ładowane za pomocą metody GetService() z IKernel. Ale dla dostawcy członkostwa to nie działa. Ponownie, nie chcę drwić z dostawcą, chcę wykonać test integracji, więc wiem, czy moje metody kontrolera rzucają jakiekolwiek wyjątki.

Odpowiedz

4

Test jednostka musi mieć domyślnego konstruktora:

[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

Sposób non-generic 'Ninject.Syntax.IResolutionRoot.Resolve (Ninject.Activation.IRequest)' nie może być używany z argumentami typu – ckonig

+0

@ckonig Używaj zamiast 'Rozwiąż metodę' 'uzyskaj '. Tak więc wywołanie 'kernel.Get ();' powinno zadziałać i nie zapomnij dodać 'using Ninject;' – nemesv

+0

Co zadziałało w tej konkretnej sytuacji, to metoda GetService() dla IKernela. Teraz zmagam się z rozwiązywaniem Niestandardowego Dostawcy Członkostwa – ckonig

Powiązane problemy