我对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()
并将结果与当前用户密码进行比较。
答案 0 :(得分:1)
重要的是区分使用单元测试测试的代码和此代码的外部依赖性。使用MOQ模拟外部依赖项,但必须在单元测试中直接实例化并测试已测试的代码。
在您的问题中,我假设您测试方法CheckUsersPassword
,SecurityService
是一个应该被模拟的依赖项。
在测试中,您必须创建类的实例(包含测试的方法)并以某种方式将依赖模拟传递给此测试类。
[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());
}