MVC コントローラーをテストしていて、リポジトリの 1 つで Save メソッドが呼び出されることをテストしたいと考えています。コントローラーは、ユーザーを登録しようとしている AccountController です。My AccountRepository には、Save と Register の 2 つのメソッドがあります。Register は、いくつかのチェックの後、Save を呼び出しています。Register が呼び出されるかどうかをテストし、リポジトリで別の単体テストを実行して、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 メソッドです。
私は何を間違っていますか?