モックは最初に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
それは特に空想ではありませんが、うまくいくと思います:
var firstTime = true;
mock.Setup(x => x.GetNumber())
.Returns(()=>
{
if(!firstTime)
return 1;
firstTime = false;
return 0;
});
最もクリーンな方法は、Queue
を作成し、Returns
に_.Dequeue
_メソッドを渡すことです。
.Returns(new Queue<int>(new[] { 0, 1, 1, 1 }).Dequeue);
一時変数を使用して、メソッドが呼び出された回数を追跡できます。
例:
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);
}
}
次のような拡張メソッドをセットアップするだけです。
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);