使用 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());
}
我对 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());
}