这是我的例子:
[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/