コンストラクター引数として別のオブジェクトに渡されるモックオブジェクトがあります。
モックされたオブジェクトのプロパティが呼び出されたことをどのようにテストできますか?これは私が現在使用しているコードです:
INewContactAttributes newContact = MockRepository.GenerateMock<INewContactAttributes>();
newContact.Stub(x => x.Forenames).Return("One Two Three");
someobject.ConsumeContact(newContact);
newContact.AssertWasCalled(x => { var dummy = x.Forenames; });
これは、「someobject」内でForenamesプロパティのゲッターが複数回使用されている場合を除いて機能します。そのとき、「Rhino.Mocks.Exceptions.ExpectationViolationException:INewContactAttributes.get_Forenames(); Expected#1、Actual#2 ..」が発生します。
単に使用する
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Any());
動作せず、以下のエラーが発生します。
「待機中の期待リストから期待値が削除されました。Repeat.Any()を呼び出しましたか?これはAssertWasCalled()ではサポートされていません。」
では、どのようにして複数の呼び出しに対応するのですか?
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());
Repeat.Any
はAssertWasCalled
では機能しません。0は何としてもカウントされるからです...それが呼び出されなかった場合、AsserWasCalled
は呼び出されなくてもTRUEを返します。
クリスの回答に同意します
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());
さらに、プロパティが呼び出される回数を正確に知っている場合は、次のことができます
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Times(n));
ここで、nはintです。
使用しているRhinoのバージョンに応じて、以下を使用できます。
// Call to mock object here
LastCall.IgnoreArguments().Repeat.Never();
呼び出される回数を確認する動機は何ですか?これは特に高価な操作ですか?もしそうなら、意味的に言えば、プロパティは安価な呼び出しでなければならないので、代わりにメソッドの後ろに置くことをお勧めします。
また、プロパティが呼び出された回数を確認することは、単体テストの目的ではありません(あまりにも多くのテストを行うのはよくある間違いであることを心配しないでください。実際にテストする必要があるのは、メソッドが期待される出力を生成するモックオブジェクトの状態が与えられていることです。これを行うためにメソッドが呼び出される回数は、実際には重要ではありません(電子メールなどを送信するサービスでない限り)。実装の詳細であり、単純なリファクターはテストが具体的すぎるためテストを中断するため、通常はテストしません。
から ここ :
mock.AssertWasCalled(x => x.Name ="Bob");
または
mock.AssertWasCalled(x => x.Name =Arg.Is("Bob"));
または
mock.AssertWasCalled(x => x.Name =Arg<string>.Is.NotNull);
newContact.Expect(c => c.ForeNames).Return(...).Repeat.Any()