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