如何断言是否使用nunit调用了一个方法
是否可以断言是否已调用方法? 我正在测试以下方法,我想声明_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); }
您应该模拟TokenManager
和TokenValidator
,然后创建两个unit testing用例:
- 情况1: validation令牌并且只调用一次
GetToken
- 情况2: 未validation令牌,并且两次调用
GetToken
情况1:
[Test] public void Subscribe_TokenIsValidated_GetTokenIsCalledOnce() { // Arrange: var tokenManagerMock = Mock.Of(); var tokenValidatorMock = Mock.Of(x => x.Validate(It.IsAny()) == true); var subscriber = new Subscriber { TokenManager = tokenManagerMock, TokenValidator = tokenValidatorMock }; // Act: subscriber.Subscribe(It.IsAny(), It.IsAny (), It.IsAny ()); // Assert: Mock.Get(tokenManagerMock).Verify(x => x.GetToken(It.IsAny (), It.IsAny()), Times.Once); }
案例2:
[Test] public void Subscribe_TokenIsExpiredOrInvalid_GetTokenIsCalledTwice() { // Arrange: var tokenManagerMock = Mock.Of(); var tokenValidatorMock = Mock.Of(x => x.Validate(It.IsAny()) == false); var subscriber = new Subscriber { TokenManager = tokenManagerMock, TokenValidator = tokenValidatorMock }; // Act: subscriber.Subscribe(It.IsAny(), It.IsAny (), It.IsAny ()); // Assert: Mock.Get(tokenManagerMock).Verify(x => x.GetToken(It.IsAny (), It.IsAny()), Times.Exactly(2)); }
或者,您可以在不TokenValidator
情况下创建unit testing,并validation是否至少调用了一次GetToken()
。 但是,在第一个示例中创建两个案例是首选,因为我们正在测试所有代码路径。
// Arrange: var tokenManagerMock = Mock.Of(); var subscriber = new Subscriber {TokenManager = tokenManagerMock}; // Act: subscriber.Subscribe(It.IsAny(), It.IsAny (), It.IsAny ()); // Assert: Mock.Get(tokenManagerMock).Verify(x => x.GetToken(It.IsAny (), It.IsAny()), Times.AtLeastOnce);
有关Moqvalidation的更多信息,请访问:
- Moq在官方网站上快速入门
- 在BlackWasp validation模拟方法的调用次数
您可以使用Verify方法使用MOQ进行validation。 像这样:
var tokenManagerMock = new Mock(); var sut = new WhateverItIsCalled(tokenManagerMock.Object); sut.Subscribe("ssss", "example@example.com", "XXX"); tokenManagerMock.Verify(m => m.GetToken(It.Is(c => c == "ssss", It.Is(x => x == false)), Times.Once);
您需要能够以某种方式将令牌管理器传递到您正在测试的系统中。 通常通过ctor或可能是财产。
我建议你使用像AutoFixture这样的东西来消除“ssss”的丑陋并使事情变得更加干燥。
您可能需要使令牌管理器模拟返回适当的内容以通过validation。 像这样的东西:
var tokenManagerMock = new Mock(); tokenManagerMock.Setup(m => m.GetToken(It.Is(x => x == "ssss", It.IsAny()).Returns("XXXXXX");