2012-05-25 13 views
5

Ich bin vertraut mit der Tatsache, dass ich keine Abhängigkeitsinjektion in Komponententests verwenden sollte, so dass ich jede Schicht unabhängig testen kann.Integrationstest mit Ninject

Dennoch möchte ich Integrationstests für meine Controller erstellen. Daher muss ich meine Repositories aus einem Komponententest in die Controller injizieren.

I folgt einem generischen Ansatz mit einem T4-Skript, das eine Testklasse für jeden Controller erstellt, die eine Testmethode für jedes ActionResult enthält. Diese Testmethode sollte die Methode einfach aufrufen, um sicherzustellen, dass keine Ausnahmen an die Oberfläche geworfen werden.

Da dieses T4-Skript verwendet wird, kann ich die Repositorys nicht manuell in die Controller einspeisen. Ich muss die Abhängigkeitsinjektion nutzen.

Aufgrund meiner früheren Erfahrung, sollte dies funktionieren, aber ich halte den Fehler bekommen:

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

Meine generierten Klassen wie folgt aussehen im Moment:

[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:

Ich habe bereits herausgefunden, dass die Repositories mit Hilfe der GetService() Methode von IKernel geladen werden können. Aber für den Mitgliedschaftsanbieter funktioniert das nicht. Nochmals, ich möchte den Anbieter nicht verspotten, ich möchte einen Integrationstest durchführen, damit ich weiß, ob meine Controller-Methoden irgendwelche Ausnahmen auslösen.

Antwort

4

Das Gerät Test muss einen Standard-Konstruktor:

[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

Das nicht gattungsgemäßes Verfahren ‚Ninject.Syntax.IResolutionRoot.Resolve (Ninject.Activation.IRequest)‘ mit Typargument – ckonig

+0

@ckonig Verwendung nicht verwendet werden kann, die "Get " Erweiterungsmethode statt Resolve. Also sollte der 'kernel.Get ();' Aufruf funktionieren und nicht vergessen, das 'using Ninject;' – nemesv

+0

hinzuzufügen. Was für diese spezielle Situation funktionierte, war die GetService() Methode von IKernel. Jetzt habe ich Probleme mit der Auflösung des Custom Membership Providers. – ckonig