razor ビュー、c#、MVC3、.net 4.0 を使用してアプリケーションを開発しました。モックを作成せずにコントローラーを単体テストしたいと考えています。要件は次のとおりです。Repository メソッドを呼び出して実行する必要があり、データベースをテストに使用する必要があります。親切に、いくつかの解決策を提供してください。
3 に答える
単体テストでは、データベースやリモート サーバーへの接続などの外部リソースを使用しない傾向があります。それがモックの理由です。
そのようなリソースにアクセスするテストを行うと便利な場合があると思います。(しかし、それらを受け入れテストまたは統合テストと呼びましょう - それらと従来の単体テストを区別するためだけに)。
MBUnitテストフレームワーク( nUnitに非常に似ています)を見てください。これにより、データベースへのすべての変更を自動的にロールバックできます(データベースを元の状態に復元することはありません)。テストを実行するたびに「クリーン」状態になります)。詳細については、次のブログ記事をご覧ください: http://blog.benhall.me.uk/2008/01/mbunit-24-rollback-rollback2-and.html
他のアプローチは、特別なデータベースを用意してデータを生成することです。つまり、一連のテストが実行されるたびに、新しいユーザー ID 名などを生成します。このアプローチでは、データベースを時々クリーンにする必要がある場合があることに注意してください (名前などの一部の値で衝突が発生したり、一部のデータが既に入力されている db で一部のシナリオをテストできない場合もあります)。
どちらのアプローチも、db スキーマが変更されないことを前提としています。データベーススキーマが変更された場合 - とにかく何らかの作業が必要になります。
この質問のポイントがわかりません。
1)それはあなたが話している統合テストであり、単体テストではありません。
2) "Visual Studio Unit Testing Framework" を実行する場合、いつでも TestMethod を記述して、モックを作成する代わりに実際のリポジトリを使用できます。モックを作成すると、リポジトリがモックに置き換えられるだけで、いつでも実際のリポジトリを使用できます。テストプロジェクトのアプリ構成自体などでdb接続文字列を構成する必要があるだけです...実際には、それがどのように設計されているかによって異なります。
3) IOC/DI について何も言及していないことに気付いたので、何も使用していないと思います。したがって、この質問です。IOC/DI を使用すると、テスト時に使用している実際のインスタンス (モックまたはリアル) をいつでも置き換えることができ、単一のエントリ/コード ポイントからオブジェクトを簡単に置き換えることができます。実際、テスト プロジェクトは、必要なすべての依存関係を設定できます。
4)MVCにはIDependencyResolverが付属していると思うので、それを検索してください。
5) IOC コンテナーは、テストを簡単にするだけです。私の 2 セントです。それ以外の場合は、手動で行います。
乾杯