2017-08-15 6 views
1

スレッドが特定の値を受け取るのを待つメソッド呼び出しをユニットテストしようとしています。スレッドは1秒に数回インターフェイスからポーリングを行い、情報がない場合はデフォルトのメッセージタイプ0を受け取ります。しかし、スレッドが0よりも上の特定のメッセージタイプを受信すると、それに応答します。私の場合、特定の値が待機を中断し、メソッドが結果を返します。しかし、私はこれをMoqにどのように設定するのですか?Moqが特定の値を返すまでデフォルト値を何度も返すように設定する

この質問は既知のシーケンスを返すことではなく、既知の値が予想されるまで不明な連続シーケンスを返すことについての質問です。ここで

は私がこれまでに得たものである:

 mockedFacade.Setup(facade => facade.RequestPayment()).Callback(
      () => 
      { 
       CallbackMessageService.AddMessage(new CallbackMessage{Type = 2, Value = 1}); 
      }).Verifiable(); 
     mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage()); 

私はCallbackMessageServiceと呼ばれるメッセージを作成するためのテスト・システムを構築します。 Facadeがfacade.GetCallbackMessage(2番目の設定)を呼び出すと、デフォルトでタイプ0のメッセージが返されます。テスト中にCallbackMessageServiceを呼び出して、CallbackMessageService.AddMessage(第1のセットアップ)経由でメッセージを追加することができます。次回facade.GetCallbackMessage()が呼び出されると、システムはその特定のメッセージを返します。

CallbackMessageServiceは機能しますが、問題は、GetCallbackMessage(2番目の設定)の設定が、CallbackMessageServiceから受信した最初のメッセージを何らかの形でキャッシュしていることです。その後、常にキャッシュされたメッセージが返され、CallbackMessageService.GetNextMessage()は再び呼び出されません。セットアップが必要なので、facade.GetCallbackMessage()が呼び出されるたびにCallbackMessageService.GetNextMessage()が常に呼び出されます。

Moqでどのように達成できますか?

私はキャッシュがMoqのデフォルトのものだと思っています。私はSetupSequenceについて知っています。問題は、特定の値を返す前に処理しなければならないデフォルト値の数を制御できないことです。

問題を特定するためにいくつかのコードを削除しました。少しの文脈があるかどうか私に教えてください。

+0

[Moqで1回目と2回目の異なる戻り値]の可能な複製(https://stackoverflow.com/questions/7287540/different-return-values-the-first-and-second-time-with-moq ) – krillgar

+0

@krillgar私はこれがこれらのタイプの質問と重複しているように見えますが、これらの質問は私の場合は常に正確な返品構造を知っています。特定の型を返す前に、無制限のデフォルトの型に0を受け取ることができます。 – evilfish

答えて

0

質問を投稿した後、私はコードを修正して解決策を見つけました。このソリューションは、facade.GetCallbackMessage()を再度呼び出す前に、インターフェイス上でfacade.CallbackMessageProcessedという別のメソッドを呼び出すため、テストするシステムでのみ機能します。私はそうのように私の利点にこれを使用することもできます。CallbackMessageProcessedが呼ばれるたび

mockedFacade.Setup(facade => facade.RequestPayment()).Callback(
    () => 
    { 
     CallbackMessageService.AddMessage(new CallbackMessage{Type = 2, Value = 1, MessageID = Guid.NewGuid().ToString()}); 
    }).Verifiable(); 
mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage()); 
mockedFacade.Setup(facade => facade.CallbackMessageProcessed(It.IsAny<CallbackMessage>())).Callback(
    (CallbackMessage c) => 
    { 
     CallbackMessageService.MessageResolved(c); 
     mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage()); 
    }); 

私はセットアップをやり直すどこバックと呼ばれる作成します。これにより、テストが完了するまでループが継続されます。だから、この問題を解決する一つの方法です。

私のfacade.GetCallbackMessage()コールバックでセットアップをやろうとしましたが、うまくいきませんでした。

これは私の特定のケースに対する回答ですが、別の返品が予想される前にMoqの設定で複数の未知の返品を許可する方法があるかどうかを確認するのはいいでしょう。私のような方法でした。

+0

私は何も新しいことを聞いたことがないので、私はこの質問を閉じる – evilfish

関連する問題