1

私たちは、MVC、Entity Framework 4.1のコード、プロジェクトのSQL Serverを使用しています。SQLiteを使って統合テストを書く経験はありますか?

あなたの経験を共有してください:どのようにデータサービスレイヤーを単体テストしますか?データサービス層とは、ある種のDbContext派生クラス宣言を内部に持つMVCコントローラが実行するはずのサービスを意味し、このEF DbContextに依存し、データをフェッチして格納するビジネス\ dataロジックをカプセル化します。

いくつかの記事や記事を読んだ後は、個別のデータベースを使用してユニット/統合テストを作成する傾向があり、SQL Compactではなくメモリ内(SQLiteなど)を使用することをお勧めします。しかし、私はそれが可能かどうかも分かりません。もしあなたがそのような経験を持っていれば、あなたがこれを達成する方法を示すために、数行のコードを分けてください。

答えて

0

私は別のデータベースをまったく使用しません。実際、私の単体テストはデータベースをまったく使用しません。

私の戦略は、DBエンティティのためにIEnityRepositoryインターフェイスを作成することです(Entityを実際の名前に置き換えてください)。私はそれらをコントローラのコンストラクタに渡します。

単体テストでは、私は単なるMockingライブラリを使用して、必要なリポジトリの模擬実装を渡し、単体テストで使用できる既知のデータセットを返すだけです。

+0

私もそれについて考えました。しかし、私は2つの理由から統合テストを好む:1)LINQの式が見つかる可能性が高い - 実際のデータベースを使ってSQLスクリプトのマッピングの問題が起きるのではない2)DbContextを適用したいデータサービスを隠すためにレイヤーを追加する必要がある – YMC

4

ユニットテストとは、テストユニット=データベースなし、外部依存関係なし、単一のテスト可能ユニットのテストのみを意味します。一度データベースに関与させたい場合は、単体テストをやり直さないでください。統合テストを行っています。

私は、EFに依存するコードの単体テスト/統合テストについて複数の回答を書いています。最後のものはhereです。したがって、サービスレイヤがコンテキスト上でlinqクエリを作成する場合、それらを確実に単体テストすることはできません。統合テストが必要です。

私は実際のコードで使用するのと同じデータベースを使用します。どうして? LINQの実装と同様に、データベース提供間のマッピングと動作が異なる可能性があるためです。また、SQLサーバーの場合はspecial EF featuresを使用できますが、これはSQLiteで使用する必要はありません。別の理由は、前回チェックしたときに、SQLiteのプロバイダは、データベースの削除、レクレーションなどをサポートしていなかったことです。これは、人が通常統合テストに使用したいものです。その解決策はDevart providerです。

+0

のユニットテスト右、私は統合テストについて話しています。私は単体テストについて言及しています。これは、サービスレベルの単体テストをある程度置き換えることになっているこの統合テストを知ったことです。私は両方の細かいことをするつもりはありません。 SQL Liteに関する情報をありがとう。 – YMC

+0

私の以前のコメントに追加したいと思います:ファイルシステムベースの(メモリではない)データベースに関する懸念はパフォーマンスです。ユニットテストはビルドプロセスの一部であり、データベース操作の束がビルド全体のパフォーマンスに悪影響を与える可能性があります – YMC

+0

@YMC:データベースを使用してアプリケーションをテストする場合は、常に統合テストが必要です。唯一の疑問は、どれだけあなたが必要なのかということです。アプリケーションをテストしますか?だから、価格を払い、遅いビルドやセットアップ・ビルド・サーバーでライブを行い、ビルドと統合テストを別々のマシンで実行させてください。 –

関連する問題