web-dev-qa-db-ja.com

MoqのSetupSequence

モックは最初に0を返し、メソッドが呼び出されるたびに1を返します。問題は、メソッドが4回呼び出された場合、次のように記述する必要があることです。

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

それ以外の場合、メソッドはnullを返します。

メソッドが最初に呼び出された後に次回呼び出されたときに、メソッドが1を返すことを記述する方法はありますか?ありがとうございました

SetupSequenceの「演算子」を増やすのは良いですか? 「はい」と思う場合は投票できます: http://moq.uservoice.com/forums/11304-general/suggestions/2973521-setupsequence-more-operators

50
Florian

それは特に空想ではありませんが、うまくいくと思います:

    var firstTime = true;

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

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

最もクリーンな方法は、Queueを作成し、Returnsに_.Dequeue_メソッドを渡すことです。

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

36
Jakub Konecki

一時変数を使用して、メソッドが呼び出された回数を追跡できます。

例:

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

次のような拡張メソッドをセットアップするだけです。

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

そして、次のようにリターンを設定します:

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