c# - 使用 stub 和模拟的正确方法是什么?

标签 c# .net unit-testing testing mocking

这是我的例子:

[TestMethod]
public void NewAction_should_return_IndexAction()
{
    NewViewModel viewModel = new NewViewModel()
    {
        Name = "José Inácio Santos Silva",
        Email = "joseinacio@joseinacio.com",
        Username = "joseinacio"
    };

    //IsUserRegistered is used to validate Username, Username is unique.
    _mockAuthenticationService.Setup(x => x.IsUserRegistered(viewModel.Username )).Returns(false);

    //IsUserRegistered is used to validate Email, Email is unique.
    _mockUsuarioRepository.Setup(x => x.GetUserByEmail(viewModel.Email));
    _mockDbContext.Setup(x => x.SaveChanges());
    _mockUsuarioRepository.Setup(x => x.Add(It.IsAny<User>()));

    _userController = new UserController(_mockUsuarioRepository.Object, _mockDbContext.Object, _mockAuthenticationService.Object);

    ActionResult result = _userController.New(viewModel);

    result.AssertActionRedirect().ToAction("Index");

    _mockAuthenticationService.VerifyAll();
    _mockUsuarioRepository.VerifyAll();
    _mockDbContext.VerifyAll();
}

我读过一些教程,他们说我们应该每次测试只使用一个模拟

但是看看我的测试,它使用了 3 个模拟,检查我的Action 是否以正确的方式工作我需要检查这 3 个模拟,不同意吗?

如何以正确的方式进行此测试?

最佳答案

每个单元测试应该只测试一件事。

在您的单元测试中,您正在测试三个模拟对象。如果 mockAuthenticationService 失败,这将被报告并且单元测试将在那里停止。其他 Mock 对象的任何错误都不会被报告并被有效隐藏。

在这种情况下,您应该创建三个单元测试,并且在每个单元测试中只验证一个 Mock 对象。其余的只是用作 stub 。 ( stub 与 Mock 对象完全相同,只是您最后不对其调用 VerifyAll)

为避免重复和浪费精力,您应该重构该单元测试,以便将大部分代码放在单独的方法中。三个单元测试中的每一个都调用此方法,然后验证单个 Mock。

您还需要进行测试以确保调用正确的重定向。这也应该在一个单独的测试中。

很简单:

[TestMethod]
public void NewAction_should_checkUserRegistered()
{
    SetupTest();
    _mockAuthenticationService.VerifyAll();
}

[TestMethod]
public void NewAction_should_GetUserByEmail()
{
    SetupTest();
    _mockUsuarioRepository.VerifyAll();
}

[TestMethod]
public void NewAction_should_SaveDBContext()
{
    SetupTest();
    _mockDbContext.VerifyAll();
}

[TestMethod]
public void NewAction_should_return_Redirects_Action()
{
    var novoActionResult = SetupTest();
    novoActionResult.AssertActionRedirect().ToAction("Index");
}

关于c# - 使用 stub 和模拟的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7322980/

相关文章:

c# - 在回传中获取 Url

c# - 从视频中导入帧

java - 在 JUnit 中使用 @RunWith 有解决方法吗?

java - 删除单元测试的依赖项

angularjs - 如何在 jasmine 规范中使用 $promise.then 模拟 AngularJS $resource

c# - 如何更新json中的特定值?

c# - 如何创建一个可以在设计时订阅另一个 WinForm 控件的 C# 属性?

.net - 屏幕记录用户操作的软件工具

c# - 我可以在不知道 dll 文件名的情况下加载程序集吗,我只知道命名空间名称

c# - LINQ to SQL 或 Entities,在这一点上?