2012-01-31 12 views
0

私は再帰的なモックを動かすことができません。RhinoMock - 再帰的なモック

SomeClass someMOck = MockRepository.GenerateMock<SomeClass>(); 

//SomeClass is having another class as a property. 

someMock.Stub(x => x.Manager.SomeData).Return("Hello"); 

実行時にエラーが発生します。

System.InvalidOperationException:以前のメソッド 'SomeClass.get_Manager();'スローするには戻り値または 例外が必要です。

私は3.6、ビルド21

任意のアイデアを使用していますか?

答えて

2

これは、someeClass.Managerに指定された値がないためです。

Managerクラスをモックし、someeClass.Managerの戻り値として設定する必要があります。

SomeClass someMock= MockRepository.GenerateMock<SomeClass>(); 
Manager managerMock= MockRepository.GenerateMock<Manager>(); 

managerMock.Stub(x => x.SomeData).Return("Hello"); 
someMock.Stub(x => x.Manager).Return(managerMock); 

しかし、別のことはコードの設計と関係があります。 Law Of Demeterには、コードでネストされたproperty.propertyを使用しないでください。本当に必要な情報だけを渡し、渡されたすべてが使用されていることを確認する必要があります。したがって、完全なManagerオブジェクトにアクセスするだけで、SomeDataにアクセスすることは本当に必要ですか?

+0

私はDemeterの法則を理解しています。しかし、考え方は、変更/リファクタリングなしでテストを行うことができるかどうかを確認することです。しかし、問題は、私が再帰的な嘲笑をしたいのですが、とにかく右にスタブアウトする必要があるということです。私はRhinoMockが自動的にそれを行うという印象を受けました。 – HAN

+0

しかし、スタブした後でも、なぜこの構文が動作しないのかわかりません。x => x.Manager.SoemData 'x.Manager'は 'System.InvalidOperationException'型の例外をスローしました。 RhinoMocksのドキュメンテーションによれば、新しい再帰的モックの一環としてこの構文を使用できます。 – HAN