2009-03-16 9 views
9

私はモックが新しく、モックフレームワークを決定しています。 Moq home引用符「伝統的な」レコード/リプレイ対Moqモデルを使った嘲笑

現在のところ、それは(特に初心者のために) 一般化し、ややわかりにくい に反するだけからかっ ライブラリのレコードは、/すべての他のフレームワークから アプローチを返信です。

誰でもレコード/再生アプローチとMoqの違いを簡単に説明できますか?フレームワークを決定する時点から、それぞれの長所と短所は何ですか?

ありがとうございました。

答えて

7

記録/再生アプローチは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フェーズです。

このコードの部品番号バリアントは、あなたが見ることができるよう

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); 

は読み非常に良くあるだろう。私はRhinoMockを使用していましたが、Moqを発見して以来、私はMoqだけを使用しています。私はそれがはるかに読みやすいコードを生成することがわかります。だから私のアドバイスはMoqのために行くことです。

+8

(ドキュメントから)やや不格好です。確かに、Moqの方が簡単ですが、テストではまだ2つのフェーズがあります。ライン2(「Expect」の呼び出し)は「レコード」フェーズに属し、ライン3と4は「再生」フェーズに属します。私は構文の単なる違いは、 "記録/再生"モデルが不可欠ではないと思います。 –

0

私はスタブ/モックされたものや実行中のコードだけをセットアップで見るのが難しいため、録音/再生をすぐにオフにしました。私はRhinoには複数の働き方があると私は信じています。特に、using()ブロックを使用して、他のコールから設定を分離することができます。

1

RhinoMockは実際には非常に用途が広いので、いずれの方法も使用できます。 RhinoMockはexpect/verifyスタイルの下でMoqより少し良く見えます。しかし、あなたがこのスタイルを使用できるという事実さえ、ドキュメントに埋め込まれています(私が最後に見た時)。現在のプロジェクトでRhinoMockよりMoqを選んだのは、セットアップ/検証がわからないからです。

レコード/再生シンタックスを使用すると、そのメソッドの後続の呼び出しでメソッドが返す値を変更することができます。これは時には役に立つことがあります。言いましたが、これを行う必要性はしばしばあなたのデザインが正しくないという匂いです。あなたが何が間違っているかをよく見極めることができたら、それは役に立ちます。

部品番号は、値を変更する機能を持っていませんが、それはこの答えは私にはあまり意味がありません

// returning different values on each invocation 
var mock = new Mock<IFoo>(); 
var calls = 0; 
mock.Setup(foo => foo.GetCountThing()) 
.Returns(() => calls) 
.Callback(() => calls++); 
関連する問題