c# - xUnit.net 与 Ninject

标签 c# asp.net-mvc testing ninject xunit.net

我在我的 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/

相关文章:

javascript - MVC 从 Razor 代码调用 Javascript 函数

c# - 使用 SqlCommand 从多个表中删除

c# - 为什么这个泛型不能转换?

c# - 向 Unity 注册 ISecureDataFormat<AuthenticationTicket>

c# - 在 C# 中拦截对属性 get 方法的调用

asp.net-mvc - 为什么 `data(“kendogrid” )` 未定义?

testing - 日志的大统一理论

java - android 中 ProgressDialog 的 Robolectric 测试

testing - 修复我的 Phoenix.Channel 的 terminate/2 方法测试中的 “owner #PID<…> exited with: shutdown”

c# - 如何使用嵌入的discord.net webhook C# 发送文件附件