有人可以澄清我对模拟验证概念的理解吗?

Pur*_*ome 2 .net asp.net rhino-mocks moq mocking

我正在玩一些单元测试和嘲笑.我正在尝试验证我的方法中的某些代码是否已被调用.我不认为我理解Verify正确的部分是正确的,因为我只能验证主要方法..这是愚蠢的,因为这是我Act无论如何.

我正在尝试测试我的逻辑是否正常工作 - 所以我认为我使用Verify来查看方法中的某些步骤已经达到并颁布.

让我们用这个例子来强调我做错了什么.

public interface IAuthenticationService
{
    bool Authenticate(string username, string password);
    SignOut();
}

public class FormsAuthenticationService : IAuthenticationService
{
    public bool Authenticate(string username, string password)
    {
        var user = _userService.FindSingle(x => x.UserName == username);
        if (user == null) return false;

        // Hash their password.
        var hashedPassword = EncodePassword(password, user.PasswordSalt);

        if (!hashedPassword.Equals(password, StringComparison.InvariantCulture))
            return false;

        FormsAuthentication.SetAuthCookie(userName, true);
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在,我想验证一下

  • EncodePassword 被称为.
  • FormsAuthentication.SetAuthCookie(..) 被称为.

现在,我并不关心这两者的含义.更重要的是,我不想测试这些方法.这必须在其他地方处理.我应该做的是验证那些方法是否被调用,如果可能的话......返回了预期的结果.

这是否正确理解'验证'对模拟的意义?

如果是这样,有人可以告诉我如何做到这一点.优先考虑,moq但我对任何事情都很满意.

Jon*_*eet 6

您通常应该(IMO,至少)模拟依赖项而不是正在测试的类中的其他方法.例如,您可以拥有一个IPasswordEncoder用于EncodePassword呼叫的接口.你可以模拟,并验证该方法已被调用...但在同一个类中,它没有那么多意义.

我敢说很多嘲弄框架可以做这种嘲弄,但我个人不会鼓励它.如果您已找到希望能够注入不同功能的位置,请考虑将它们作为单独的依赖项.