2012-05-25 184 views
5

我熟悉的事實是,我不應該在單元測試中使用依賴注入,所以我可以單獨測試每個圖層。與Ninject的集成測試

不過,我想爲我的控制器創建集成測試。因此,我需要將我的存儲庫從單元測試注入控制器。

我遵循一個使用T4腳本的通用方法,它爲每個控制器創建一個測試類,其中包含每個ActionResult的測試方法。該測試方法應該簡單地調用該方法以確保沒有異常拋出到表面。

由於使用了這個T4腳本,我無法手動將存儲庫提供給控制器。我需要使用依賴注入。

根據我以往的經驗,這應該工作,但我不斷收到錯誤:

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

我生成的類看起來像這樣的時刻:

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

編輯:

我已經發現,可以在IKernel的GetService()方法的幫助下加載存儲庫。但對於會員提供商,這不起作用。 同樣,我不想嘲笑提供者,我想執行集成測試,所以我知道我的Controller方法是否拋出任何異常。

回答

4

單元測試必須具有一個默認的構造:

[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

非通用方法「Ninject.Syntax.IResolutionRoot.Resolve(Ninject.Activation.IRequest)」不能與類型參數被用於 – ckonig

+0

@ckonig使用'Get '擴展方法而不是Resolve。所以'kernel.Get ();'調用應該可以工作,不要忘記添加'using Ninject;' – nemesv

+0

這個特定情況的工作原理是IKernel的GetService()方法。現在,我正在努力解決自定義會員提供 – ckonig