是否可以断言是否已调用方法?我正在测试以下方法,我想声明_tokenManager.GetToken()已被调用.我只是想知道方法是否已被调用,因为该方法不返回值.我正在使用Moq.
谢谢,
代码段
public void Subscribe(string code, string emailAddress, string columnKey)
{
// Request authentication token
var token = _tokenManager.GetToken(code, false);
if (!_tokenValidator.Validate(token))
{
// Token has expired or invalid - refresh the token
token = _tokenManager.GetToken(code, true);
}
// Subscribe email
_silverpopRepository.Subscribe(token.AccessToken, emailAddress, columnKey);
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*iak 17
你应该嘲笑TokenManager和TokenValidator,然后再创建两个单元测试用例:
GetToken只调用一次GetToken被称为两次情况1:
[Test]
public void Subscribe_TokenIsValidated_GetTokenIsCalledOnce()
{
// Arrange:
var tokenManagerMock = Mock.Of<TokenManager>();
var tokenValidatorMock = Mock.Of<TokenValidator>(x =>
x.Validate(It.IsAny<Token>()) == true);
var subscriber = new Subscriber
{
TokenManager = tokenManagerMock,
TokenValidator = tokenValidatorMock
};
// Act:
subscriber.Subscribe(It.IsAny<string>(), It.IsAny<string>(),
It.IsAny<string>());
// Assert:
Mock.Get(tokenManagerMock).Verify(x =>
x.GetToken(It.IsAny<string>(), It.IsAny<bool>()), Times.Once);
}
Run Code Online (Sandbox Code Playgroud)
案例2:
[Test]
public void Subscribe_TokenIsExpiredOrInvalid_GetTokenIsCalledTwice()
{
// Arrange:
var tokenManagerMock = Mock.Of<TokenManager>();
var tokenValidatorMock = Mock.Of<TokenValidator>(x =>
x.Validate(It.IsAny<Token>()) == false);
var subscriber = new Subscriber
{
TokenManager = tokenManagerMock,
TokenValidator = tokenValidatorMock
};
// Act:
subscriber.Subscribe(It.IsAny<string>(), It.IsAny<string>(),
It.IsAny<string>());
// Assert:
Mock.Get(tokenManagerMock).Verify(x =>
x.GetToken(It.IsAny<string>(), It.IsAny<bool>()), Times.Exactly(2));
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以创建单元测试而无需模拟TokenValidator并验证是否GetToken()至少调用过一次.但是,在第一个示例中创建两个案例是首选,因为我们正在测试所有代码路径.
// Arrange:
var tokenManagerMock = Mock.Of<TokenManager>();
var subscriber = new Subscriber {TokenManager = tokenManagerMock};
// Act:
subscriber.Subscribe(It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<string>());
// Assert:
Mock.Get(tokenManagerMock).Verify(x =>
x.GetToken(It.IsAny<string>(), It.IsAny<bool>()), Times.AtLeastOnce);
Run Code Online (Sandbox Code Playgroud)
在Moq阅读更多关于验证的信息:
您可以使用验证方法使用 MOQ 进行验证。像这样:
var tokenManagerMock = new Mock<ITokenManager>();
var sut = new WhateverItIsCalled(tokenManagerMock.Object);
sut.Subscribe("ssss", "example@example.com", "XXX");
tokenManagerMock.Verify(m => m.GetToken(It.Is<string>(c => c == "ssss", It.Is<bool>(x => x == false)), Times.Once);
Run Code Online (Sandbox Code Playgroud)
您需要能够以某种方式将令牌管理器传递到您的测试系统中。通常通过 ctor 或者一个属性。
我建议您使用 AutoFixture 之类的东西来消除“ssss”的丑陋,并使事情变得更加干燥。
您可能还需要让令牌管理器模拟返回一些适当的内容以通过验证。像这样的东西:
var tokenManagerMock = new Mock<ITokenManager>();
tokenManagerMock.Setup(m => m.GetToken(It.Is<string>(x => x == "ssss", It.IsAny<bool>()).Returns("XXXXXX");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27858 次 |
| 最近记录: |