0

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 メソッドです。

私は何を間違っていますか?

4

1 に答える 1

3

上記のコードから、SaveメソッドはRegisterメソッドの一部であるように見えます。その場合、RegisterメソッドはmockRepositoryの一部であるため、モックされます。したがって、Saveを呼び出す実際の実装は呼び出されません。

上記が正しいと仮定すると(私はそう信じていますが、コントローラーコードがないため、実際にはわかりません)、個別のテストを作成する必要があります。

  1. あなたが今持っているもの、保存検証を削除します。
  2. リポジトリの単体テストを行い、Registerが呼び出されたときにSaveが呼び出されることを確認します。
于 2012-11-09T02:10:01.680 に答える