2012-01-05 6 views
1

私はSOFとGoogleの結果について多くの投稿を読んでいます。モッキングは何ですか?

まだ嘲笑の価値を理解していません。 SOF」ポストのいずれかから

:モッキングは、あなたのユニットテストのうち、依存関係を維持するために使用される What is Object Mocking and when do I need it?

オブジェクト。場合によっては、 "SelectPerson"のようなテストを行い、データベースから人を選択してPersonオブジェクトを返すこともあります。

はこれを行うには、通常、データベースへの依存が必要になり、それは は1のように見えるのデータセットを返す場合がありますので、あなたは、モックフレームワークと データベースとの相互作用をシミュレートすることができますモックしかしオブジェクトと コードをテストして、 というデータベースへの接続をテストするのではなく、 というオブジェクトにデータセットを変換する処理を確実に行うことができます。上記の

例はまた、このように、多くのGoogleの結果に存在している(コードチュートリアルセクション) http://quickduck.com/blog/2008/02/18/unit-testing-mocking-and-dependency-injection/

しかし、我々はモックを設計しているため、それだけで、ユニットテストアサーションのための100%の成功方法を結果メソッド&は、TestCaseを満たす必要があります。 テストで失敗することはできません。実際のデータベースとは異なります。

+0

モックは、DBを使用しないでテストできるようにする方法の1つで、これを使用するとテストがより多くの統合テストに変わります。これには、テスト実行時間を含むいくつかの利点がありますが、* all *にDBスキーマ/ etcが不要で、DBAがスケープで遊んでいなくても開発を進めることができます。 –

答えて

0

Mockingの背後にある基本的な概念は、開発者がコード、ビジネスロジックを他のコード単位やDB、ファイルシステム、サービスへの外部接続から分離してテストするのに役立ちます。

コードはテスト容易性のために設計されていなければなりません。これが達成されると、開発者はCUT(Test Under Class)が依存するインターフェイスから受け取る値を知ります。あなたの場合、開発者はデータベースから返される値を知る必要があります。彼は、(DBから返された)このデータが、彼が実装したコードの要件に従って処理されているかどうかをチェックすることだけを心配すべきです。

すべてのテストを合格させる条件はOver Mockingと呼ばれ、理解が不十分なためにTest Doublesが原因です。あなたの特定のケースでは、クエリのテストに興味があり、返された値がアプリケーションロジックによってどのように処理されるかをテストすることに興味がないなら、高速なHSQLDBやH2のようなメモリ内のDBを試すことができます。このようにして、単体テストの範囲を広げることができます。しかし、多くの開発者は、単体テストではなく統合テストでこれらのクエリをテストしようとします。実際の用語では、実際のDBを使用してコードをテストすると、単なる単体テストとは言えません。

もう1つの情報を追加するには、DBに照会すると状況に応じて1つ以上のオブジェクトを持つことも、結果セットにオブジェクトを戻すこともできません。だから、モック/スタブがこれらの値の1つを返すように設定することができます。モックを "No Results Found"のような例外をスローすると、それは否定的なシナリオになります。例えば

0

テイクこのクラス/メソッド:

class Foo { 

    ... 

    public static function instantiateFromDb(Database $db, $id) { 
     $record = $db->query("SELECT * FROM table WHERE id = $id"); 
     $foo = new self; 
     $foo->id = $record['id']; 
     ... 
     $foo->initialize(); 
     $foo->calibrate(); 
     return $foo; 
    } 

    ... 

} 

Foo::instantiateFromDbデータベース・レコードからオブジェクトをインスタンス化するために使用されるやや複雑な方法である(はい、それはほとんどの擬似コードです)。これを行うには、データベースオブジェクトを使用します。データベースオブジェクトは、データベースからエントリを取得するために使用されます。だから、このメソッドをテストするには、レコードが入ったデータベースが必要です。それはかなり大きな依存関係です。データベースを起動して稼働させる必要があります。データベースに接続する必要があり、適切なデータをデータベースに取り込む必要があります。ダウンしないようにする必要があります。多くの動く部品に依存します。あなたがしたいのは、Foo::instantiateFromDbメソッドをテストするだけです。

あなたがしているのは、単にDatabaseオブジェクトをモックすることです。あなたが式の外に巨大な依存関係をとっているとテスト方法だけに焦点を当てることができます:あなたは(有効なレコードを返すことが1つの特定の事をしているため)作品を知っているオブジェクトを使用してデータベースをあざけることで

public function testInstantiationFromDatabase() { 
    $mockDb = new Mock('Database'); 

    prepare $mockDb so it always returns a valid record 
    when its query() method is called... 

    $this->assertInstanceOf('Foo', Foo::instantiateFromDb($mockDb, 1)); 
} 

あなたは実際にテストしたい。

関連する問題