我对Moq相当陌生,我不确定这是否有可能,但是可以说,如果我有一个命名的方法,GeneratedHashedAndSaltedPassword()
而我正在从命名的方法中对该方法进行调用,那么我CheckUsersPassword()
是否有可能从单元测试Moq中编写代码表示以下内容的表达式:验证是否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();
}
我试图设置CheckUsersPassword,但我仍然不知道如何甚至不需要执行验证。有人在这种问题上有更多经验吗?
这是CheckUserPassword的作用:
public bool CheckUsersPassword(string password)
{
return SecurityService.GenerateHashedAndSaltedPassword(password, Salt) == Password;
}
它可以简单地调用GenerateHashedAndSaltedPassword()
并将结果与当前用户密码进行比较。
重要的是要区分使用单元测试进行测试的代码和该代码的外部依赖关系。外部依赖关系使用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());
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句