web-dev-qa-db-ja.com

偽物はモックよりも優れていますか?

私はこのオープンソースプロジェクトを偶然見つけました Fake It Easy と認めざるを得ません。非常に興味深いようですが、FIEの偽物とMoq Mocksの違いは何ですか?特定の用途に適したものはありますか?

編集:

この新しいフレームワークについて、Moqと言うよりも優れている点は何ですか?

50

明確にするために、私はFakeItEasyを作成したので、1つのフレームワークが他のフレームワークよりも優れているかどうかは明確に述べません。私ができることは、いくつかの違いを指摘し、動機を与えることですwhy私はFakeItEasyを作成しました。機能的には、MoqとFakeItEasyの間に大きな違いはありません。

FakeItEasyには「検証可能」または「期待」はありませんが、アサーションがありますが、これらは常にテストの最後に明示的に記述されます。これにより、テストが読みやすくなり、理解しやすくなります。また、初心者が複数のアサーション(多くの呼び出しまたはモックオブジェクトに期待を設定する)を回避するのにも役立ちます。

以前はRhino Mocksを使っていましたが、特にAAA構文が導入された後は、Moqの流暢なAPIのほうが好きでした。 Moqで私が気に入らなかったのは、どこでもmock.Objectを使用する必要がある「モックオブジェクト」でした。私は、「自然な」モックを使ったRhinoアプローチの方が好きです。すべてのインスタンスは、偽のタイプの通常のインスタンスのように見えます。私は両方の世界の最高のものを望んでおり、完全に自由な手で構文を使用して何ができるかを見たかったのです。個人的には(明らかに)両方の世界の最高のものをうまく組み合わせたものを作ったと思いますが、巨人の肩の上に立っていると、それはとても簡単です。

ここで述べたように、主な違いの1つは用語にありますが、FakeItEasyは最初にTDDとモッキングを初心者に紹介するために作成され、モックとスタブの違い(Rhinoでの方法)を心配する必要があります。私の意見ではあまり役に立ちません。

例外メッセージに重点を置いたので、例外メッセージを見ただけで、テストのどこに問題があるのか​​が非常に簡単にわかります。

FakeItEasyには、他のフレームワークにはない拡張機能がいくつかありますが、まだ十分に文書化されていません。

FakeItEasyは、(おそらく)使用するダミー値を解決するためのメカニズムを備えているため、コンストラクター引数を持つクラスのモック処理が少し強化されています。テストプロジェクト内にDummyDefinition(Of T)クラスを実装することで、独自のダミー値定義を指定することもできます。これは、FakeItEasyによって自動的に取得されます。

構文は明らかな違いですが、どちらが優れているかは、主に好みの問題です。

私が今忘れている他の多くの違いがあると私は確信しています(そして公平にするために、私は生産でMoqを使用したことがないので、それについての私の知識は限られています)が、これらは最も重要な違いだと思います。

91
Patrik Hägne

テストで使用される用語は少し混乱することがあります。異なる概念の違いを説明する最良の情報源は、Martin Fowlerによる Mocks Are n't Stubs です。要約すると、fakeは、スタブとモックの両方を表す一般的な用語です。

25
Adam Byrtek

モックの用語は混乱を招く可能性があり、時には非常に直感的でない場合があります。

したがって、多くの人々は、あなたがfakesmocks、およびstubsしかない単純で新しい用語を提案しました。

Fakeは、それらがどこから来てどのように使用されているかに関係なく、可能なすべての種類のテストdoubleの総称です。

それ以上に、fakesは、1つの単一の次元に沿ってのみ区別されます:テスト結果に影響を与えるかどうか。または、言い換えると、テストの実行中に何らかの方法で使用される偽の戻り値を設定する必要があるか、それとも 'silent '一部の依存関係を満たすためにのみ役立つオブジェクト。

Stubそれは 'silent'ですオブジェクト。

モックそれはアクティブに参加していますテストに実行

それ以外には、それ以上の区別はありません。これには確かに歴史的なメリットがありますが、現在は主に直観に反し、学問的であり、テスト駆動開発の非常に重要な概念を難読化しています。

MoqFakeItEasyの比較について:2つのフレームワーク大部分は同じ概念的な観点から-違いはAPIと用語のみ ...

トーマス

11
Thomas Weller