gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:09:18 25 4
gpt4 key购买 nike

我正在玩弄一些单元测试和模拟。我正在尝试验证在我的方法中是否调用了某些代码。我不认为我理解正确的模拟的 Verify 部分,因为我只能验证 main 方法.. 这很愚蠢,因为这就是我 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;
}
}

那么现在,我想验证一下

  • EncodePassword 被调用。
  • FormsAuthentication.SetAuthCookie(..) 被调用。

现在,我不关心这两者的实现。更重要的是,我不想测试这些方法。这必须在别处处理。尽管我应该做的是验证是否调用了这些方法,并且......如果可能......返回了预期的结果。

这是对“验证”与模拟的含义的正确理解吗?

如果是这样,有人可以告诉我如何做到这一点。最好使用 moq,但我对任何事情都很满意。

最佳答案

您通常(至少在 IMO 上)应该模拟依赖关系,而不是模拟被测类中的其他方法。例如,您可以有一个用于 EncodePassword 调用的 IPasswordEncoder 接口(interface)。您可以模拟那个,并验证该方法是否已被调用...但在同一个类中它没有多大意义。

我敢说很多模拟框架可以做这种模拟,但我个人不鼓励这样做。如果您找到希望能够注入(inject)不同功能的地方,请考虑将它们设为独立的依赖项。

关于.net - 有人可以澄清我对模拟的验证概念的理解吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com