2009-08-17 10 views
7

私はこの混乱を常に抱えています。私が偽のコードを使用していくつかの操作をアサートするコードを書くと、実際に擬似コードではなく実際のオブジェクトを使用して実際の実装を信頼するにはどうすればいいですか?例えばスタブとモックをいつ使用するのですか?

、私はこのコードをしました -

[Test] 
    public void CanCreateContactsWithData() 
    { 
     using(ISession session = factory.OpenSession()) 
     using (ITransaction trans = session.BeginTransaction()) 
     { 
      _contactId = (long) session.Save(contact); 
      trans.Commit(); 
     } 

     Assert.AreNotEqual(0, _contactId); 
    } 

このコードは、「接触」とは、データベースに保存されたかを取得しますかオブジェクトの実装をテストします。私は実際のデータベース接続の代わりにスタブを使用した場合、データベースに格納するための別のテストを行う必要がありますか?そして、あなたはそれを統合テストと呼んでいますか?

回答をいただきありがとうございます。

答えて

11

Martin Fowlerさんはいい議論をしていますhere。彼の記事から

Meszarosは、テスト目的のために実際のオブジェクトの代わりに使用するふりオブジェクトの任意の種類の総称として、用語のテストダブルを使用しています。この名前は、映画のスタント・ダブルの概念から来ています。メサザロスは次に、4種類のダブルを定義しました。

  • ダミーオブジェクトは渡されていますが、実際には使用されていません。通常、パラメータリストを入力するために使用されます。
  • 偽のオブジェクトは実際に実装されていますが、通常は生産には適していないようなショートカットを使用します(メモリデータベースのほうが良い例です)。
  • スタブは、テスト中に行われたコールに対して缶入りの応答を提供します。通常、テスト用にプログラムされたもの以外のものにはまったく応答しません。スタブはまた、「送信された」メッセージを記憶している電子メールゲートウェイスタブ、または「送信されたメッセージの数」など、コールに関する情報を記録することもできます。
  • ここでは、モックとは、受け取ることが予想されるコールの仕様を構成する期待値であらかじめプログラムされたオブジェクトです。

この種のダブルのうち、モックのみが行動検証を主張する。

+0

+1です。非常に役立ちます :) – Goaler444

0

はい、実際のデータベースを使用すると、定義に応じてより機能的か統合テストになります。個人的には、単体テストは、他のすべてを分離して、そのメソッドだけを正確にテストすることになっていると感じます。したがって、セッションやトランザクションのどちらが機能しているかにかかわらず、単体テストでは、これらのオブジェクトに必要な時に、必要に応じて呼び出されることを保証する必要があります - それはモックとスタブが入る場所です。あなたの単体テストは外部機能と切り離されているので、基本単位としてテストすることができます。とにかくとにかく。

+0

いくつかの例であなたの答えを詳述することは可能でしょうか。ありがとうございます。 – asyncwait

+0

これは長い答えですが、http://www.mockobjects.com/book(プラグのお詫び)をご覧ください。記事の場合は –

2

あなたが書いたコードをテストする必要があります。データベース接続オブジェクトコードを記述した場合は、それをテストします。そうでなければ、それが独自のテストを持つライブラリの一部であれば、それを模倣/スタブし、接続オブジェクトがそれ自身のテストスイートを渡すなら、それは動作すると仮定することができます。

たとえば、私はHibernateメソッドへの呼び出しをテストしません。私はHibernate開発者がそれを完全にテストしたと仮定します。しかし、私は私は、その期待を設定する模擬を使用して、正しい方法を呼び出すことをテストするだろう。

1

関数がある値を返す(何もしない)だけの場合にスタブを使用します。関数が呼び出されたかどうかは気にしませんが、単なる物事を分離したいだけです。

モーックはより強力です。関数が呼び出されたかどうかを追跡したり、回数を指定したり、関数の値を取得することもできます。

あなたのケースでは、データベースを模擬したいので(機能的ではなく単体テストになる)、ISessionとITransactionをモックできます。この値をメモリに保存し、正しい値が保存されているかどうかを確認できます。

0

単体テストのほとんどは、個々のコードをテストすることです。スタブとモックは、単体でテストするのに役立つ単なるツールです。作品を個別にテストすることで、各作品をより詳細にテストすることができますが、完全な画像については何も保証されません。さまざまな種類の統合テストがこれを行います。

大規模な機能をテストする場合、これらの操作をUIレベルでテストすることが多いため、データベースロジックの実際の統合テストが最も価値の低いテスト成果物となることがよくあります。

関連する問題