私はモックが初めてで、モック フレームワークを決定しています。Moqの家の引用.
現在、これは、他のすべてのフレームワークの一般化された (特に初心者にとって) やや非直感的な記録/応答アプローチに反する唯一のモッキング ライブラリです。
記録/再生アプローチとは何か、Moq の違いを簡単に説明できる人はいますか? 特にフレームワークを決めるという観点から、それぞれの長所と短所は何ですか?
ありがとう。
私はモックが初めてで、モック フレームワークを決定しています。Moqの家の引用.
現在、これは、他のすべてのフレームワークの一般化された (特に初心者にとって) やや非直感的な記録/応答アプローチに反する唯一のモッキング ライブラリです。
記録/再生アプローチとは何か、Moq の違いを簡単に説明できる人はいますか? 特にフレームワークを決めるという観点から、それぞれの長所と短所は何ですか?
ありがとう。
記録/再生アプローチはRhinoMocksによってサポートされています。基本的な考え方は、テストの実行を記録フェーズと再生フェーズの2つのフェーズに分割することです。もう少し具体的に
var repo = new MockRepository();
var dependency = repo.DynamicMock<IDependency>();
With.Mocks(repo).Expecting(delegate {
Expect.Call(dependency.AMethod(1)).Return(result);
}).Verify(delegate {
var sut = new Sut(wrappee);
sut.DoStuffThatCallsAMethod();
Assert.IsTrue(sut.ResultState);
});
したがって、ExpectingブロックはRecordフェーズであり、VerifyブロックはReplayフェーズです。
このコードのMoqバリアントは次のようになります
var dependency = new Mock<IDependency>();
dependency.Expect(dep => dep.AMethod(1)).Returns(result);
var sut = new Sut(wrappee.Object);
sut.DoStuffThatCallsAMethod();
Assert.IsTrue(sut.ResultState);
あなたが見ることができるように、それは読むのがはるかに良いです。以前はRhinoMocksを使用していましたが、Moqを発見して以来、Moqのみを使用しています。私はそれがはるかに読みやすいコードを生成することを発見しました。だから私のアドバイスはMoqに行くことです。
RhinoMocksは実際には非常に用途が広く、どちらのアプローチも使用できます。RhinoMocksは、expect/verifyスタイルではMoqよりも少し良く見えます。ただし、このスタイルを使用できるという事実でさえ、ドキュメントに埋め込まれています(前回見たとき)。現在のプロジェクトでは、RhinoMocksよりもMoqを選択しました。これは、セットアップ/検証が行われることに気づかなかったためです。
記録/再生構文を使用すると、メソッドがその後のそのメソッドの呼び出しで返す値を変更できます。これは時々役に立ちます。そうは言っても、これを行う必要があるのは、多くの場合、デザインが正しくないという匂いです。何が悪いのかがよくわかり、先に進まなければならない場合でも便利です。
Moqには値を変更する機能がありますが、多少不格好です(ドキュメントから)
// returning different values on each invocation
var mock = new Mock<IFoo>();
var calls = 0;
mock.Setup(foo => foo.GetCountThing())
.Returns(() => calls)
.Callback(() => calls++);
セットアップでスタブ/モックされたものや実行中のコードを確認するのが難しくなるため、録音/再生をすぐに終了しました。Rhinoには複数の働き方があると思います。特に、using()
ブロックを使用して、セットアップを他の呼び出しから分離できます。