使用 Moq 检查是否从另一个方法调用了一个方法

Check if call to a method is made from another method using Moq

我对 Moq 很陌生,我不确定这是否可能,但是假设,如果我有一个名为 GeneratedHashedAndSaltedPassword() 的方法,并且我正在从名为 [=] 的方法调用该方法13=] 有没有机会我可以从单元测试 Moq 表达式中写出:验证 GeneratedHashedAndSaltedPassword 是否从 CheckUsersPassword 方法调用?

如果 CheckUsersPassword 方法无一例外地调用 GeneratedHashedAndSaltedPassword 方法,我就会知道它执行正确。

我现在拥有的并不多,因为我在最小起订量方面遇到了困难,这是合乎逻辑的。

[Test]
public void CheckIfPasswordIsHashed_Test()
{
    var securityServiceMock = new Mock<User>();
    securityServiceMock.Setup(m => m.CheckUsersPassword(It.IsAny<string>())).Returns(true);
    securityServiceMock.VerifyAll();
}

我正在尝试设置 CheckUsersPassword,但我仍然不知道如何甚至是否可以执行我需要的验证。有人对此类问题有更多经验吗?

这就是 CheckUserPassword 的作用:

public bool CheckUsersPassword(string password)
{
    return SecurityService.GenerateHashedAndSaltedPassword(password, Salt) == Password;
}

它对 GenerateHashedAndSaltedPassword() 进行简单调用并将结果与​​当前用户密码进行比较。

重要的是区分使用单元测试测试的代码和此代码的外部依赖项。外部依赖项使用 MOQ 进行模拟,但测试代码必须在单元测试中直接实例化和调用。

在你的问题中,我假设你测试了方法 CheckUsersPassword 并且 SecurityService 是一个应该被模拟的依赖项。

在测试中你必须创建 class 的实例(其中包含被测试的方法)并以某种方式将依赖模拟传递给这个被测试的 class。

[Test]
public void CheckIfPasswordIsHashed_Test()
{
    // Arrange
    // Mock dependency which is the service and setup
    // GenerateHashedAndSaltedPassword so it does what you need  
    var securityServiceMock = new Mock<User>();
    securityServiceMock.Setup(m => m.GenerateHashedAndSaltedPassword(
        It.IsAny<string>(), 
        ItIsAny<Salt>())
    .Returns(Password);

    // TestedClass needs a place where the mocked instance can be injected,
    // e.g. in constructor, or public property
    var testedClass = new TestedClass(securityServiceMock.Object);

    // Act
    testedClass.CheckUsersPassword(password);

    // Assert
    securityServiceMock.Verify(m => m.GenerateHashedAndSaltedPassword(
        It.IsAny<string>(), 
        ItIsAny<Salt>()), 
    Times.Once());
}