cko*_*nig 5 asp.net-mvc t4 integration-testing unit-testing ninject
我熟悉这个事实,我不应该在单元测试中使用依赖注入,所以我可以独立地对每个层进行单元测试.
不过,我想为我的控制器创建集成测试.因此,我需要从单元测试中将我的存储库注入控制器.
我遵循使用T4脚本的通用方法,为每个控制器创建一个测试类,包含每个ActionResult的测试方法.这个测试方法应该简单地调用方法,以确保没有异常抛出到表面.
由于使用此T4脚本,我无法手动将存储库提供给控制器.我需要利用依赖注入.
根据我以前的经验,这应该工作,但我一直得到错误:
Unable to get default constructor for class <<UnitTest>>
Run Code Online (Sandbox Code Playgroud)
我生成的类目前看起来像这样:
[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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我已经发现,可以使用IKernel的GetService()方法加载存储库.但对于会员提供商,这不起作用.同样,我不想模拟提供程序,我想执行集成测试,所以我知道我的Controller方法是否抛出任何异常.
单元测试必须有一个默认构造函数:
[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);
}
}
Run Code Online (Sandbox Code Playgroud)