web-dev-qa-db-fra.com

SetupSequence dans Moq

Je veux qu'une maquette renvoie un 0 la première fois, puis renvoie 1 chaque fois que la méthode a été appelée. Le problème est que si la méthode est appelée 4 fois, je devrais écrire ceci:

mock.SetupSequence(x => x.GetNumber())
    .Returns(0)
    .Returns(1)
    .Returns(1)
    .Returns(1);

sinon la méthode retourne null.

Existe-t-il un moyen d'écrire que la prochaine fois que la méthode sera appelée après la première fois, la méthode renvoie 1? Je vous remercie

Est-il bon d'avoir plus "d'opérateurs" pour SetupSequence? Si vous pensez OUI, vous pouvez voter: http://moq.uservoice.com/forums/11304-general/suggestions/2973521-setupsequence-more-operators

50
Florian

Ce n'est pas particulièrement chic, mais je pense que cela fonctionnerait:

    var firstTime = true;

    mock.Setup(x => x.GetNumber())
        .Returns(()=>
                        {
                            if(!firstTime)
                                return 1;

                            firstTime = false;
                            return 0;
                        });
41
Romain Verdier

La manière la plus propre est de créer une Queue et de passer la méthode .Dequeue À Returns

.Returns(new Queue<int>(new[] { 0, 1, 1, 1 }).Dequeue);

36
Jakub Konecki

Vous pouvez utiliser une variable temporaire pour garder une trace du nombre de fois que la méthode a été appelée.

Exemple:

public interface ITest
{ Int32 GetNumber(); }

static class Program
{
    static void Main()
    {
        var a = new Mock<ITest>();

        var f = 0;
        a.Setup(x => x.GetNumber()).Returns(() => f++ == 0 ? 0 : 1);

        Debug.Assert(a.Object.GetNumber() == 0);
        for (var i = 0; i<100; i++)
            Debug.Assert(a.Object.GetNumber() == 1);
    }
}
3
sloth

Configurez simplement une méthode d'extension comme:

public static T Denqueue<T>(this Queue<T> queue)
{
    var item = queue.Dequeue();
    queue.Enqueue(item);
    return item;
}

Et puis configurez le retour comme:

var queue = new Queue<int>(new []{0, 1, 1, 1});
mock.Setup(m => m.GetNumber).Returns(queue.Denqueue);
1
MacShack