56 votes

Méthode de configuration avec tableau de paramètres

Je développe des tests pour une application. Il existe une méthode qui a un params comme paramètre. J'ai configuré la méthode à l'aide de Moq mais lorsque j'exécute le test, la valeur de retour de la méthode est nulle, ce qui signifie qu'elle n'est pas moquée.

Voici un exemple de code :

 public interface ITicketManager {
    string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch);
}

public class TicketManager : ITicketManager {
    private Queue<string> ticketQueue = new Queue<string>();

    public string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch) {
        var firstQueuedTicket = ticketQueue.Peek();
        var firstQueuedTicketMatchesAnyOfRequested = ticketsToMatch.Any(t => t == firstQueuedTicket);

        if(firstQueuedTicketMatchesAnyOfRequested)
            return firstQueuedTicket;

        return null;
    }
}

Le code fictif ressemble à ceci :

 var mock = new Mock<ITicketManager>();

mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string>()))
    .Returns(p => { 
    if(p.Contains("A"))
            return "A";

    return null;
});

Pourquoi ne frappe-t-il jamais la méthode moquée?

14voto

Wiktor Zychla Points 23918

Je pense que le params string doit correspondre à It.IsAny<string[]>() plutôt qu'à It.IsAny<string>()

0voto

Ben Wesson Points 86

En utilisant Moq, le code ci-dessous fonctionne pour configurer un rappel sur une méthode avec un argument params. Définir le deuxième argument comme un tableau fait l'affaire.

         MockLogger
            .Setup(x => x.Info(It.IsAny<string>(), It.IsAny<object[]>()))
            .Callback<string, object[]>((x, y) => _length = x.Length);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X