我正在测试一个MVC控制器,并希望测试在我的一个存储库中调用Save方法。控制器是一个试图注册用户的AccountController。我的AccountRepository有两个方法,Save和Register。一些检查后注册正在调用Save。我不确定我是否应该测试是否调用Register并在我的Repository上运行单独的单元测试来验证是否在调用Register时调用了Save,或者我是否在测试中错误地设置了Moq。
这是我的测试:
[TestMethod]
public void register_post_saves_valid_registration()
{
_mockMemberRepository.Setup(r => r.GetByEmail(It.IsAny<string>())).Returns(_testMember);
// Arrange
RegisterViewModel model = new RegisterViewModel()
{
Email = "registerme@talentsite.com",
Password = "test123",
ConfirmPassword = "test123"
};
// Act
ActionResult result = _controller.Register(model);
// Assert
_mockMemberRepository.Verify(r => r.Register(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once());
_mockMemberRepository.Verify(r => r.Save(It.IsAny<Member>()), Times.Once());
}
这一行:
_mockMemberRepository.Verify(r => r.Register(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once());
通过测试,但是当我介绍下面这一行时:
_mockMemberRepository.Verify(r => r.Save(It.IsAny<Member>()), Times.Once());
失败了。
这是我的存储库中的Register方法:
public MembershipCreateStatus Register(string email, string password, string confirm)
{
if (password.Equals(confirm))
{
try
{
Member m = GetByEmail(email);
if (m == null)
{
int format = (int)PasswordFormatEnum.Encrypted;
string salt = GenerateSalt();
string pass = EncodePassword(password, format, salt);
m = new Member()
{
Email = email,
Password = pass,
PasswordSalt = salt,
PasswordFormat = format
};
Save(m);
return MembershipCreateStatus.Success;
}
else
return MembershipCreateStatus.DuplicateEmail;
//"A user with that email address already exists. Please use the Forgotten Password link if you need to recover your password.";
}
catch (Exception ex)
{
_logger.LogError(ex);
return MembershipCreateStatus.ProviderError;
}
}
return MembershipCreateStatus.InvalidPassword;
}
我的Save
方法只接受一个Member对象,并且是一个void方法。
我做错了什么?
答案 0 :(得分:3)
从上面的代码中,似乎Save方法是Register方法的一部分。如果是这种情况,则Register方法是mockRepository的一部分,因此它被模拟。因此,永远不会调用调用Save的实际实现。
假设上述情况属实(我相信是,但由于我没有Controller代码而无法说明),您需要创建单独的测试: