27

MSMQを呼び出すためにインターフェイスをモックする必要があります。キューに10個のメッセージがある実際のMSMQシナリオをシミュレートするために、Moqを使用する方法はありますか。モックされた関数を10回呼び出し、事前定義されたオブジェクトを取得できます。 11回目は別の戻り値(たとえばnull)を取得する必要がありますか?

4

3 に答える 3

39

Moqには、名前空間で呼び出される拡張メソッドがあります。これは、特定の呼び出しごとに個別の戻り値を定義できることを意味します。SetupSequence()Moq

一般的な考え方は、必要な戻り値をチェーンするだけであるということです。次の例では、最初の呼び出しはJoeを返し、2番目の呼び出しはJaneを返します。

customerService
.SetupSequence(s => s.GetCustomerName(It.IsAny<int>()))
.Returns("Joe")   //first call
.Returns("Jane"); //second call

ここにいくつかの詳細情報。

于 2013-10-09T00:05:26.277 に答える
16

このようなシナリオでは、単純なカウンターを使用することがあります。

int callCounter = 0;
var mock = new Mock<IWhatever>();
mock.Setup(a => a.SomeMethod())
    .Returns(() => 
    {
       if (callCounter++ < 10)
       {
           // do something
       }
       else
       {
           // do something else
       }
    });
于 2013-01-16T21:48:06.003 に答える
2

これを行うために別の関数を設定することもできます。必要に応じて、関数にパラメーターを渡すこともできます。

_serviceMock.Setup(x => x.SomeMethod(It.IsAny<String>())).Returns((String param) => getTimesCalled(param));
于 2014-03-31T19:56:57.323 に答える