2009-06-07 10 views
5

私はデータベースアクセスを必要とするメソッドを持つ多くのオブジェクトを持っています。私たちは単体テストを目指していますが、可能であればモックオブジェクトの使用を避けたいと考えています。私は、DBアクセスを必要としないように、以下に示すValidateメソッドをリファクタリングする方法があるかどうか疑問に思っています。実際のアプリケーションでは、通常はかなり進んでいますが、この単純化された例で十分であると思います。ユニットテストのためのデータベース依存関係を避けるために

モックオブジェクトは必要な場合に使用する方法を学びますが、オーバーヘッドのように思えるので、代替案を探しています。

public class Person 
    { 
     public string Name; 

     public string Validate() 
     { 
      if (PersonDA.NameExists(Name)) 
      { 
       return "Name Already Used"; 
      } 

     } 
    } 
+2

「単体テスト」と「統合テスト」の違いと、それらを使用するタイミングと、それらが最適であることを確認してください。 –

+0

私はしばしば、模擬フレームワークhttp://www.unit-testing.net/CurrentArticle/How-To-Remove-Data-Dependencies-In-Unit-Testsを必要としない以下のパターンを使用します。html – T123

答えて

7

私はちょうどモックオブジェクトルートに行きます。はるかに柔軟性があり、あなたの実際のオブジェクトにテストコードを置く道を踏み出そうとしているように聞こえますか?

もちろん、検証コードをboolean isValid(Person)のメソッドでPersonValidatorオブジェクトに抽出します。テストコードでは、テストケースに基づいてtrueまたはfalseを返すモックバリデーターを使用します。

+0

オブジェクトにテストコードを入れたくありません。私が考えていなかったリファクタリングの方法があるかどうか疑問に思っていただけで、モックオブジェクトの必要性が取り除かれました。 – tjjjohnson

0

単体テストに使用するデータベースを設定してください。 すべてのデータアクセスにモックアップを使用すると、実際にはあまりテストしないでしょうか? :)

+0

おそらく私は例をあまり単純化していません。しばしば、データアクセスメソッドを呼び出す以外の何かを行うチェックが行われます。 – tjjjohnson

+0

不一致 - テストDBは貴重なツールですが、絶対に必要な場合を除き、テストDBを使用するのを最小限に抑えるよう積極的に努力する必要があります。名前を検証するようなものは以前は見られなかったが、データベースにヒットする本質的な必要性はない。これは実装の詳細なので、できるだけ依存性なしでテストする必要がある。 – dimo414

2

dbunitを見てください。これは特に、小さなテストデータベースを設定するように設定されているため、単体テスト時に実際のオブジェクトをモックデータベース上で使用できます。それを使ったテストは、モックオブジェクトを開発するよりはるかに簡単で、データアクセスコードを変更するよりはるかに安全です。

+0

これはまた、単純なモックオブジェクトだけでなく、実際のコードが動作することを確認することもできます。 –

5

Personクラスは、データベースアクセスコードに隠れて静的な依存関係があるため、単体テストが難しいです。 Personと、状態を検証するために必要な情報を提供するいくつかの新しいタイプのオブジェクトとの間に動的なコラボレーションを導入することによって、この結合を破ることができます。 Personの単体テストでは、Personオブジェクトの "スタブ"実装をコラボレーターに渡すことで、データベースにヒットせずに有効か無効かをテストできます。

データベースに当てはまる実際の実装を個別のテストでテストできます。これらのテストは遅くなりますが、アクセッサメソッドの複雑なロジックがなくてもデータベースクエリへの直接的な変換が行われるため、テストの数は少なくなります。

あなたが望むのであれば "モックオブジェクトを使用する"ことができますが、現在の設計ではコマンドを期待するのではなくクエリをスタブする必要があるため、モックオブジェクトフレームワークはあまりにも複雑なツールです。手書きのスタブは、テストの失敗を診断しやすくします。

+0

+1 - ユニットテストはすべて依存関係とその管理についてです。 – duffymo

0

なぜモックを避けようとしていますか?単体テストを実践し、データアクセスコードを持っている場合は、モック/スタブ/インジェクト方法に快適になるのが最も簡単です。

モックフレームワークを持ちたくない場合は、必要に応じて単純なスタブをコード化することができます。

データアクセスコードをインターフェイスの背後に置くと、データベースが不要になります。テスト中に依存関係注入を使用して模擬コードまたはスタブデータアクセスコードを挿入することを検討してください。

+0

ほとんどの場合、このような状況のために嘲笑する選択肢があるかどうかを調べようとしています。 – tjjjohnson

関連する問題