2012-07-03 19 views
27

モックが最初に0を返し、メソッドが呼び出されたときはいつでも1を返します。問題は、この方法は、4回呼び出された場合、私はそれを書くべきであるということです。MoqのSetupSequence

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

そうでないメソッドがnullを返します。

メソッドが最初に呼び出された次回の時刻を書き込む方法はありますか?メソッドは1を返しますか? ありがとうございました

SetupSequenceの "演算子"を増やしてもよろしいですか?空想particularyではありません http://moq.uservoice.com/forums/11304-general/suggestions/2973521-setupsequence-more-operators

答えて

32

を、私はそれが仕事だと思う:あなたが考えるYES場合は、投票することができます

var firstTime = true; 

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

          firstTime = false; 
          return 0; 
         }); 
+0

よろしくお願いします。 – Florian

+0

うまく動作します!ありがとうございました ! – Florian

3

あなたはメソッドが呼び出された回数を追跡するために、一時的な変数を使用することができます。

例:

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

クリーンな方法はQueueを作成して渡すことです.Dequeue方法にReturns

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

+4

"無限の"後続の呼び出しをサポートしていません... –

+0

@RomainVerdier - いいえ、そうではありません。私はOPが4つの呼び出しで解決策を求めると思う。 –

+3

すべて - 私の最初の間違いを避ける。 Return(myQueue.Dequeue())を持つように定義すると、ラムダ式を提供するのではなく、実際に結果をデキューしたため、最初の結果しか返されません。 – sfuqua

1

だけでセットアップなどの拡張方法:

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

A次に返品を設定してください:

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