web-dev-qa-db-fra.com

comment affirmer si une méthode a été appelée à l'aide de nunit

est-il possible d'affirmer si une méthode a été appelée? Je teste la méthode suivante et je veux affirmer que le _tokenManager.GetToken () a été appelé. Je veux juste savoir si la méthode a été appelée car la méthode ne renvoie pas de valeur. J'utilise Moq.

Merci,

extrait de code

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);
}
21
James Radford

Vous devez vous moquer de TokenManager et TokenValidator, puis créer deux cas de tests unitaires:

  • Cas 1: le jeton est validé et GetToken est appelé exactement une fois
  • Cas 2: le jeton n'est pas validé et GetToken est appelé exactement deux fois

Cas 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);
}

Cas 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));
}

Alternativement, vous pouvez créer un test unitaire sans se moquer de TokenValidator et vérifier si GetToken() a été appelée au moins une fois. Cependant, la création de deux cas comme dans le premier exemple est préférable car nous testons tous les chemins de code.

// 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);

En savoir plus sur la vérification dans Moq sur:

17
Dariusz Woźniak

Vous pouvez vérifier en utilisant MOQ en utilisant la méthode Verify. Comme ça:

var tokenManagerMock = new Mock<ITokenManager>();
var sut = new WhateverItIsCalled(tokenManagerMock.Object);
sut.Subscribe("ssss", "[email protected]", "XXX");
tokenManagerMock.Verify(m => m.GetToken(It.Is<string>(c => c == "ssss", It.Is<bool>(x => x == false)), Times.Once); 

Vous devez être en mesure de passer le gestionnaire de jetons dans votre système sous test d'une manière ou d'une autre. Habituellement via le ctor ou peut-être une propriété.

Je vous suggère d'utiliser quelque chose comme AutoFixture pour supprimer la laideur qui est "ssss" et rendre les choses un peu plus sèches.

Vous devrez peut-être également faire en sorte que le gestionnaire de jetons retourne quelque chose de approprié qui passera la validation. Quelque chose comme ça:

var tokenManagerMock = new Mock<ITokenManager>();
tokenManagerMock.Setup(m => m.GetToken(It.Is<string>(x => x == "ssss", It.IsAny<bool>()).Returns("XXXXXX");
2
Jack Hughes