2010-11-23 21 views
3

エンティティのハードコードされたリストを含む私の偽のリポジトリでは、単純なことが始まりました。ASP.NET MVCユニットテスト - 偽のリポジトリが扱いにくくなった

私が進歩するにつれて、私の共有する偽のリポジトリは膨れ上がっています。私はこれらのリストに新しいプロパティと新しいエンティティを継続的に追加しています。これはメンテナンスが非常に難しく、テストが何をしているのかを見ることも難しいです。私はこれが "General Fixture"と呼ばれる反パターンだと信じています。

ASP.NET MVCユニットテストの研究では、コントローラに渡されるリポジトリフィクスチャを準備する2つの方法があります。

  1. すべてのテスト、各テスト内のリポジトリの
  2. モック部品

私は上記のオプション#2を探求する誘惑が、私が読んだの間で共有されているハードコードされた偽のリポジトリを作成します。リポジトリをモックするのは良い考えではなく、コレクションを操作するコントローラ(つまり、ページング/ソート/フィルタリング機能を持つ)をテストするシナリオではかなり難しいようです。

コミュニティへの私の質問...

何リポジトリ器具を製造するための方法は、初歩的な例を超えても動作しますか?

答えて

2

私はあなたが2つのオプションのうちの1つだけを選択するべきではないと思います。偽のリポジトリを使用するほうが良い場合があり、嘲笑する方が良い場合があります。私は、ケースバイケースで必要なものを評価すべきだと思います。たとえば、UsersServiceのテストを作成していて、ブール値を返すIUserRepository.DoesUserExist()を呼び出す必要がある場合は、偽のリポジトリを使用することはできません。真偽を返すように呼び出すほうが簡単です。

Moqは素晴らしいです。

+0

これらはすべてすばらしい答えでした。私は個人的なテストのためにリポジトリをモックアップするためにこの質問を投稿して以来、Moqを使用してきました。私はあなたが示唆したように両方の方法を使用することが有効であると信じています。また、モックで使用するためのデータを生成するルーチンを作成すると便利です。つまり、データを作成するコードを複製するのではなく、データも共有されません。 :) – Mayo

2

私はORM(私の場合はNHibernate)を使用して探している新しいプロジェクトで同様の理由。そうすれば、(SQL Serverではなく)「メモリ内の」SQLLiteインスタンスを指し示すことができ、セットアップ/維持するのがはるかに簡単です(私が望む)。そうすれば、特定のシナリオ(タイムアウトなど)をテストする必要がある場合は、リポジトリを模擬する必要があります。

2

TDD用ユニットテストを使用している場合は、Rhino Mocksをダウンロードし、オプション#2を使用します。

+0

#2に使っていたMOQ(http://code.google.com/p/moq/)もあります。私はまた、それが非常に扱いにくく、時間がかかるということを発見しています。それが私がORMの角度を考えている理由です。 –

1

ほとんどの場合、テスト固有のリポジ​​トリモックを使用します。私はこれを自分でやってはいけないというアドバイスを見たことがないし、それがうまくいくことがわかった。ほとんどの場合、私たちのリポジトリメソッドとそれゆえのモックは単一のモデルまたはモデルのリスト(データコンテキストではない)しか返さないので、各テストに固有のデータを作成して各クエリに分離するのは簡単です。つまり、同じテストで他のテストやクエリに影響を与えずに、好きなデータを模擬することができます。データが作成された理由とテストの内容を確認するのは非常に簡単です。

私はチームに参加しており、時には共有モックデータも作成することに決めました。私はルーチンがダイナミックなクエリを生成し、すべてのテストを模擬するために必要なデータがデータベースの重複部分を生成するため、決定が一般的に行われたと思います。しかし、振り返ってみると、データベースから返される内容ではなく、結果の照会だけをチェックする必要があると示唆していたでしょう。したがって、データはまったく嘲笑されませんでした。コードを変更する必要がありました。オプション2を動作させる方法を見つけることができない場合は、コードをリファクタリングしてよりテスト可能にする方法があるかもしれないことを説明するためにこれを言及します。

関連する問題