【发布时间】:2014-08-21 15:21:03
【问题描述】:
我有一个标准 MVC 5 Web 应用程序的简单控制器。我安装了 MVC 5 Ninject nuget 包。我创建了一个构造函数,并注入了我定义的接口。如果我创建一个公共属性,它也会被注入。
现在,当我创建一个 unittest 项目并想要测试 mvc 控制器时。我怎样才能做到这一点?我必须创建一个内核。内核被创建,如果我得到我的 IPersonComponent 的实例,它就会被创建。但是为什么我的财产没有被注入呢?
我创建了两个选项,但我都得到了 nullreference 异常...
界面:
public interface IPersonComponent
{
void DoSomething();
}
实施:
public class PersonComponent : IPersonComponent
{ public void DoSomething()
{
throw new NotImplementedException("The method is fired but not implemented");
}
}
测试初始化:
private IKernel _kernel;
[TestInitialize()]
public void Initialize()
{
_kernel = new StandardKernel();
}
选项 1
运行良好的控制器:
public class HomeController : Controller
{
private readonly IPersonComponent _component;
public HomeController(IPersonComponent component)
{
_component = component;
}
}
单元测试失败,因为 PersonComponent 为空:
[TestClass]
public class HomeControllerTest
{
[Inject]
public IPersonComponent PersonComponent { get; set; }
[TestMethod]
[ExpectedException(typeof(NotImplementedException))]
public void Index()
{
// Arrange
HomeController controller = new HomeController(PersonComponent);
// Act
ViewResult result = controller.Index() as ViewResult;
// Assert
Assert.IsNotNull(result);
}
}
选项 2
控制器:
public class HomeController : Controller
{
[Inject]
public IPersonComponent PersonComponent { get; set; }
public HomeController()
{
}
public ActionResult Index()
{
PersonComponent.DoSomething();
return View();
}
}
测试:
[TestMethod]
[ExpectedException(typeof(NotImplementedException))]
public void Index()
{
// Arrange
HomeController controller = new HomeController();
// Act
ViewResult result = controller.Index() as ViewResult;
// Assert
Assert.IsNotNull(result);
}
这行得通: 但为什么它会起作用?为什么不自动注入?
[TestMethod]
public void TestDoSomething()
{
var kernel = new StandardKernel();
var comp = kernel.Get<IPersonComponent>();
comp.DoSomething();
}
根据答案编辑:
选项 1
[TestMethod]
[ExpectedException(typeof(NotImplementedException))]
public void Index()
{
_kernel.Inject(this);
// Arrange
HomeController controller = new HomeController(PersonComponent);
// Act
ViewResult result = controller.Index() as ViewResult;
// Assert
Assert.IsNotNull(result);
}
选项 2
[TestMethod]
[ExpectedException(typeof(NotImplementedException))]
public void Index()
{
// Arrange
HomeController controller = _kernel.Get<HomeController>();
// Act
ViewResult result = controller.Index() as ViewResult;
// Assert
Assert.IsNotNull(result);
}
【问题讨论】:
标签: c# asp.net-mvc dependency-injection ninject