使用moq验证在mvc控制器上调用方法

时间:2012-11-09 01:59:15

标签: asp.net-mvc unit-testing moq

我正在测试一个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方法。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

从上面的代码中,似乎Save方法是Register方法的一部分。如果是这种情况,则Register方法是mockRepository的一部分,因此它被模拟。因此,永远不会调用调用Save的实际实现。

假设上述情况属实(我相信是,但由于我没有Controller代码而无法说明),您需要创建单独的测试:

  1. 您现在拥有的那个,删除保存验证。
  2. 存储库的单元测试,并确保在调用Register时调用Save。