モック(MoqまたはRhino Mocks)インターフェイスのメソッドに渡された値を見つける方法は?

StackOverflow https://stackoverflow.com/questions/1802580

質問

Moq を使用していますが、別のモックフレームワークに簡単に交換できます必要な場合

インターフェイスが定義されています:

public interface IBaseEngineManagerImp
{
   void SetClientCallbackSender(IClientCallbackSender clientCallbackSender);
}

次に、 IBaseEngineManagerImp をモックします

mockEngineManagerImp = new Mock<IEngineManagerImp>();
EngineManager engineManager = new EngineManager(mockEngineManagerImp.Object);

engineManager は、値を渡して SetClientCallbackSender を呼び出します。

ユニットテストから SetClientCallbackSender に渡された値を取得するにはどうすればよいですか

(テストの一環として clientCallbackSender のメソッドをいくつか呼び出したい)

役に立ちましたか?

解決

モックの.Callbackメソッドを使用して、SetClientCallbackSenderメソッドに渡されたパラメーターの関数を呼び出すことができます。

mockEngineManagerImp.Setup(x => x.SetClientCallbackSender(It.IsAny<IClientCallbackSender>()))
            .Callback((IClientCallbackSender c) => c.DoSomething());

他のヒント

rhinoでは、 WhenCalled または GetArgumentsForCallsmadeOn を使用します:

Thingy argument;
mock
  .Stub(x => x.SetClientCallbackSender(Arg<IClientCallbackSender>.Is.Anything))
  .WhenCalled(call => argument = (Thingy)call.Arguments[0]);
// act
//...
// assert
Assert.AreEqual(7, argument.X); 

この実装の問題は、最新の引数を取得することです。 (Is.Anythingの代わりに)引数の制約を使用することで、これをさらに制御できます。

または

// act
//...
// assert
Thingy argument = 
  (Thingy)mock
    .GetArgumentsFormCalsMadeOn(x => x.SetClientCallbackSender(
      Arg<IClientCallbackSender>.Is.Anything))[0][0];

GetArgumentsFormCalsMadeOn の問題は、2次元配列、各呼び出しの行、各引数の列を返すことです。したがって、テスト対象のユニットが実行するコールの数を正確に知る必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top