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方法是否拋出任何異常。
非通用方法「Ninject.Syntax.IResolutionRoot.Resolve(Ninject.Activation.IRequest)」不能與類型參數被用於 – ckonig
@ckonig使用'Get'擴展方法而不是Resolve。所以'kernel.Get ();'調用應該可以工作,不要忘記添加'using Ninject;' –
nemesv
這個特定情況的工作原理是IKernel的GetService()方法。現在,我正在努力解決自定義會員提供 – ckonig