如何断言是否使用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); } 

您应该模拟TokenManagerTokenValidator ,然后创建两个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");