2012-05-25 151 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