テスト クラスで使用しているモック ライブラリの 1 つのインスタンスを使用したいのですが、一部のテストでは、メンバー関数の 1 つをモックして、モック動作/戻り値を実行/返すことが必要な場合があります。他のテストでは、ライブラリのモックされていない (ネイティブの) 機能が必要になる場合があります。あるインスタンスのセットアップ (モックされた動作) と別のインスタンスの "UNSetup" (モックされていない動作) を切り替える方法はありますか?
2 に答える
2
これを行う組み込みのメカニズムはありませんが、部分モックを使用すると、同じことができます (いくつかの制限があります)。部分モックを使用すると、次のように、インターフェイスのみではなく、インターフェイスの具体的な実装をモックできます。
var partialMock = new Mock<ServiceImplementation>();
制限は、モックする可能性のあるすべてのメソッドが仮想である必要があることです。そうでない場合、Moq はそれらをインターセプトできません。
public class ServiceImplementation
{
public virtual int SomeMethod()
{
return 5;
}
public virtual int SomeOtherMethod()
{
return SomeMethod()*2;
}
}
var partialMock = new Mock<ServiceImplementation>();
// we stub one method
partialMock.Setup(m => m.SomeMethod()).Returns(3);
// and use other's real implementation
var value = partialMock.Object.SomeOtherMethod();
もちろん、問題は仮想性にあります。メンバーを仮想化できない場合、これは明らかに機能しません。ただし、マイナーな回避策があります。スタブ セットアップの一部として実際の実装を使用します。
// note we base our stub on interface now
var implementation = new ServiceImplementation();
var mock = new Mock<IServiceImplementation>();
// we call real implementation as part of return setup
mock.Setup(m => m.SomeMethod()).Returns(implementation.SomeMethod());
于 2012-03-07T07:16:35.773 に答える
1
どうですか:
MyMock.CallBase = true;
セットアップされていないメソッドの場合、実際の実装が呼び出されます...
于 2012-08-09T07:33:56.503 に答える