我在我的MVC3项目中使用了Ninject,它工作得很好,但是我想知道在我的测试项目中使用Ninject的好方法是什么?
以下是我目前正在做的事情:
[Fact]
public void ReturnsViewResultWithDefaultViewName()
{
// Arrange
var membershipService = new MembershipService(new EFMembershipProvider());
var transactionService = new TransactionService();
var controller = new HomeController(membershipService, transactionService);
// Act
var result = controller.Index();
// Assert
var viewResult = Assert.IsType<ViewResult>(result);
Assert.Empty(viewResult.ViewName);
}发布于 2011-03-10 02:41:44
您的测试似乎使用了NInject在MVC框架下运行时需要填充的所有依赖类。当在单元测试中使用模拟时,IoC的真正好处就来了。
如果您使用Moq,您的单元测试可能如下所示:
// Arrange
var membershipService = new Mock<IMembershipService>();
membershipService.Setup(m => m.CurrentUser)
.Returns(new MyPrincipal() { Name = "Bob", ID = 12345 });
var transactionService = new Mock<ITransactionService>();
transactionService.Setup(t => t.SomeRandomMethod())
.Throws<MyBadTransactionException>();
var controller = new HomeController(membershipService.Object, transactionService.Object);
...这使您能够创建在使用应用程序的普通“运行时”对象时很难产生的条件。此外,它将被测类(示例中的HomeController)与其他对象完全隔离,这将使您的单元测试运行得更快。
查看Moq项目或谷歌"moq“获取更多信息。当然,还有其他的模仿框架。我只是更熟悉Moq。
发布于 2011-02-21 00:18:43
遗传上被接受的建议是:不要在测试中使用IoC -使用Ninject的目标是你在测试中首先不需要大量的东西。当事情变得太复杂时,它会帮助代码告诉你。
如果你觉得你的代码确实有不可避免的复杂性,你不能通过改进设计来让人满意,看看AutoFixture,特别是xunit.net集成-它和/或其他自动锁定容器可能是合适的,因为它们直接解决了你在问题中强调的问题。
https://stackoverflow.com/questions/5055201
复制相似问题