私はこのオープン ソース プロジェクトFake It Easyに出くわしました。認めざるを得ませんが、非常に興味深いように見えますが、疑問があります。FIE 偽物と Moq Mocks の違いは何ですか? 特定の用途に適したものはありますか?
編集:
この新しいフレームワークについて、Moq と言うよりも優れている点は何ですか?
私はこのオープン ソース プロジェクトFake It Easyに出くわしました。認めざるを得ませんが、非常に興味深いように見えますが、疑問があります。FIE 偽物と Moq Mocks の違いは何ですか? 特定の用途に適したものはありますか?
編集:
この新しいフレームワークについて、Moq と言うよりも優れている点は何ですか?
明確にするために、私は FakeItEasy を作成したので、あるフレームワークが他のフレームワークよりも優れているかどうかは絶対に言いません。私にできることは、いくつかの違いを指摘し、FakeItEasy を作成した理由を動機付けすることです. 機能的には、Moq と FakeItEasy の間に大きな違いはありません。
FakeItEasy には「検証可能」または「期待」はありませんが、アサーションがありますが、これらは常にテストの最後に明示的に述べられています。これにより、テストが読みやすく理解しやすくなると思います。また、初心者が複数のアサートを回避するのにも役立ちます (多くの呼び出しやモック オブジェクトに期待値を設定する場合)。
以前は Rhino Mocks を使用していましたが、特に AAA 構文が導入された後は、Moq の流暢な API の方が気に入りました。私が Moq で気に入らなかったのは、どこでも mock.Object を使用しなければならない「モック オブジェクト」でした。「自然な」モックを使用した Rhino アプローチの方が好きです。すべてのインスタンスは、偽造された型の通常のインスタンスのように見え、感じます。私は両方の長所を生かしたいと思っていましたが、完全に自由な手があったときに構文で何ができるかを見たいと思っていました. 個人的には(もちろん)、両方の世界の最高のものをうまくミックスしたものを作成したと思いますが、巨人の肩の上に立っていると、それは非常に簡単です.
ここで述べたように、主な違いの 1 つは用語です。FakeItEasy は、初心者に TDD とモッキングを紹介するために最初に作成され、モックとスタブの違いを前もって心配する必要がありました (Rhino で必要な方法)。私の意見ではあまり役に立ちません。
私は例外メッセージに多くの焦点を当ててきました。例外メッセージを見るだけで、テストで何が間違っているかを簡単に判断できるはずです。
FakeItEasy には、他のフレームワークにはない拡張機能がいくつかありますが、これらはまだ十分に文書化されていません。
FakeItEasy は、使用するダミー値を解決するメカニズムを備えているため、コンストラクター引数を持つクラスをモックする場合に (うまくいけば) 少し強力です。テスト プロジェクト内に DummyDefinition(Of T) クラスを実装することで、独自のダミー値定義を指定することもできます。これは FakeItEasy によって自動的に取得されます。
構文は明らかな違いであり、どちらが優れているかは主に好みの問題です。
私が今忘れている違いは他にもたくさんあると思います(公平を期すために、私自身は本番環境で Moq を使用したことがないため、知識は限られています)が、これらが最も重要な違いだと思います。
テストで使用される用語は、少し混乱する可能性があります。異なる概念の違いを説明する最良の情報源は、Martin Fowler によるMocks Aren't Stubsです。要約すると、フェイクは、スタブとモックの両方を表す一般的な用語です。
モックの用語は混乱を招く可能性があり、非常に直感的でない場合もあります。
したがって、多くの人が、フェイク、モック、およびスタブのみを使用する、より単純な新しい用語を提案しました。
フェイクは、どこから来てどのように使用されるかに関係なく、可能なすべての種類のテストダブルの総称です。
それを超えて、偽物は 1 つの次元でのみ区別されます。テスト結果に影響を与えるかどうか。または、言い換えれば、テストの実行中に何らかの形で使用される偽の戻り値を設定する必要があるか、または依存関係を満たすためだけに機能する「サイレント」オブジェクトであるかどうか。
スタブは、その 'サイレント' オブジェクトです。
モックはテスト実行に積極的に参加しています
それ以上の違いはありません - 確かに歴史的なメリットがありますが、現在では直感に反し、学術的であり、テスト駆動開発の本当に重要な概念を難読化しています。
MoqとFakeItEasyの比較について: 2 つのフレームワークは、概念的な観点からはほぼ同じです -違いは API と用語のみです ...
トーマス
私の観点からすると、FakeはMocをキャンセルしません。たとえば、Dev Magic Fakeを使用してDALとビジネスレイヤーを偽造し、同時にMVCでMockを使用してHTTPContextに使用します
var repoistory = new FakeRepository<ProductTypeForm, VendorForm>();
repoistory.Save(productTypeForm);
this.FillDropDown(new FakeRepository<VendorForm>());
前のコードでは、Dev Magic Fake は ProductTypeForm を保存し、Dev Magic Fake から VendorForm を取得して ProductTypeForm にリンクします。この保存操作は永続的です。
Dev Magic Fake の詳細については、CodePlex を参照してください: http://devmagicfake.codeplex.com
このメソッドをテストするには、HTTP コンテキストをモックする必要があります
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
だから私は偽物と偽物を扱っています