22

Rhino Mocksのスタブとモックは、具象クラスではなく、インターフェースにのみ適しているというのは正しいですか?私はこのコードを機能させるためにかなりの時間を費やしました。スタブされたpubSubClientが常にクラスからSendメソッドを呼び出すとは思っていませんでした。そのメソッドにはいくつかの依存関係があり、例外をスローします。

[Test]
public void Test01()
{
    PubSubMessage psm = new PubSubMessage(); 
    var pubSubClient = MockRepository.GenerateStub<PubSubClient>();
    pubSubClient.Stub(x => x.Send(psm)).IgnoreArguments().Return(null);
    // actual PubSubClient Send method throws exception
    // the rest of the test is skipped...
}

ただし、インターフェイスを抽出し、IPubSubClientで同じテストを実行すると、期待どおりに機能しているようです。

Rhinoでモック/スタブしたいすべてのクラスのインターフェースを抽出する必要があるということですか?または、技術的または概念的に何かが欠けていますか?

更新:わかりました。欠落している部分がわかったようです 。RhinoMocksは非仮想メソッドの呼び出しをインターセプトできません。したがって、インターフェイスを使用するか、具象クラスのすべてのメソッドを仮想化する必要があると思います。別のオプションがある場合は訂正してください。

4

5 に答える 5

23

部分的なモックを使用するというブライアンの答えは正しくありません。それは部分的なモックの目的ではありません。

Jon Ericksonの答えはほとんど正しいです。RhinoMocksとMoqは、非仮想呼び出しをインターセプトすることも、静的メソッドまたはプロパティをインターセプトすることもできません。つまり、次のように偽造することはできません。

DateTime.Now; // static property, can't fake static property
someClass.SomeNonVirtualMethod(); // can't fake non-virtual method
sealedClass.Foo(); // can't fake anything on sealed classes
Utilities.SomeStaticMethod(); // can't fake static methods
someList.Any(); // can't fake extension methods like Linq's .Any()

ジョンが述べたように、TypeMockはこれらを偽造することができます。

すべての呼び出しをインターセプトできる追加のモックフレームワークであるMicrosoftMolesフレームワークがあることに注意してください。TypeMockと同じように機能し、.NETプロファイラーAPIを使用して呼び出しをインターセプトします。

Molesは無料です(今のところ)。ベータ版でもあります。Molesは、 MicrosoftPexツールでのみ機能します。また、そのAPIは、TypeMockの洗練されたエレガントなAPIよりも明らかに劣っています。

于 2010-03-05T23:23:58.920 に答える
3

メソッドを仮想化する必要があります。Rhinoモック(および他のほとんどの分離フレームワーク)は、スタブ/モックを作成するためにプロキシクラスを利用します。

TypeMock Isolatorを使用する場合、この分離フレームワークは.NET Profiler APIを利用してスタブ/モックを作成するため、何でもモックできます。

于 2010-03-05T21:27:20.127 に答える
2

これは本質的に正しいことであり、一般的には良い習慣です。ただし、これは特定のタイプのコーディングにのみ役立ちます。

オブジェクトを「より高いパワー」が操作できるものと考えないでください。代わりに、それらを互いにメッセージを送信できる自律的な「人々」と考えてください。インターフェイスは、単一のオブジェクトによって送信されるメッセージを表します。

次に、モックを使用して、依存関係の偽の実装を提供するのではなく、正しいメッセージが送信されたことを確認します。

理想的には、既存のクラスと完全に一致するインターフェースを作成しないでください。代わりに、インターフェースを使用するクラスは、インターフェースの形式でそのニーズを宣言します。

于 2010-03-05T23:59:42.430 に答える
1

部分モックを使用すると、具象クラスの機能をモックアウトできます。参照:http ://www.ayende.com/wiki/Rhino+Mocks+Partial+Mocks.ashx

于 2010-03-05T15:57:45.980 に答える
0

モックしたいメソッドを仮想化する以外に、これを行う別の方法はないと思います-具象クラスのモックを作成する方法は、モックされている具象クラスを動的にサブクラス化してから、指定されたメソッドをオーバーライドすることです。テストで指定する動作。これには、仮想メソッドが正しく機能する必要があります。

于 2010-03-05T21:29:12.030 に答える