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

时间:2016-09-14 11:08:28

标签: c# unit-testing moq

我对Moq很新,我不确定这是否可能,但是,如果我有一个名为GeneratedHashedAndSaltedPassword()的方法,我正在从名为{{1}的方法调用该方法我是否有机会从单元测试Moq表达式中写出:验证CheckUsersPassword()方法是否调用了GeneratedHashedAndSaltedPassword

如果CheckUsersPassword方法调用CheckUsersPassword方法而没有任何例外,我会知道GeneratedHashedAndSaltedPassword方法已正确执行。

我现在所拥有的并不多,因为我在使用Moq时遇到困难及其逻辑。

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

我正在尝试SetUp CheckUsersPassword,但我仍然不知道我是否可以预先确认我需要的验证。有人对此类问题有更多经验吗?

这就是CheckUserPassword的作用:

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

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

1 个答案:

答案 0 :(得分:1)

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

在您的问题中,我假设您测试方法CheckUsersPasswordSecurityService是一个应该被模拟的依赖项。

在测试中,您必须创建类的实例(包含测试的方法)并以某种方式将依赖模拟传递给此测试类。

[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());
}