我在我的 MVC 3 项目中使用 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);
}
最佳答案
看来您的测试正在使用 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。
关于c# - xUnit.net 与 Ninject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055201/