2017-04-20 20 views
3

完全な.netフレームワークをターゲットとするコードでは、IDbConnectionとpoint it at a mocked DataSetをモックアップして、クエリが正しく実行されていることをテストできます。同様に、EntityFramework 6を​​使用していた場合は、mocked DbSetのIQueryablesを返すことができ、それに対してデータレイヤロジックをテストできます。.netコアでDapperクエリをテストするにはどうすればよいですか?

ただし、.netコアdoesn't support DataSets(これはin the futureを変更することがありますか?)

その間に、クエリロジックをテストするためにIDbConnectionを使用してクエリできるオブジェクトのコレクションを作成する方法はありますか?

答えて

5

いいえ、すべてのdapperはIDbConnectionクラスの上にある拡張メソッドです。

IDbConnection)(SQL文字列を理解する)のためのInMemory実装はありません。

ただし、完全に自律して実行する場合は、単体テストを実行するたびに新しいSQLサーバーを起動することをお勧めします。 https://hub.docker.com/r/microsoft/mssql-server-linux/

か...

またはエンティティフレームワークへの移行を、彼らは、メモリ内のバッキングストアに対してユニットテストにあなたを許可する:これは簡単にMicrosoftがSQLServerのために作られたことをドッキングウィンドウのイメージで行うことができます。

なぜですか?

Dapperには、SQLを生成するための便利な機能がいくつか含まれています。それは決してSQLから抽象的ではありません。そして、SQLはC#コードの単なるテキストです。解析も実行もしません。したがって、ユニットの背後にあるデータベースを使用せずにSQL/Dapperコードをユニットテストすることはできません。

エンティティフレームワークはそれとは異なります。データベース内でC#コード/抽象化(IDbCollectionなど)したいことがあるすべてのものを作成しようとします。次に、SQLコードを生成する1つの実装と、インメモリバッキングストアを使用する1つの実装を行います。この方法でコードを単体テストできます。

Microsoftのソリューション

Microsoftは、多くの場合、Repository Patternを使用してアドバタイズします。これは、基本的に、すべてのデータベース呼び出し/コマンドを別のクラスに抽象化し、これらのクラスをインターフェイスするための高価な言葉であり、コード内のすべてのインターフェイスを(依存関係注入を使用して)使用します。これで、sqlクエリに期待するすべてのコードをテストする単体テストを書くことができます。このインターフェイスでは、メソッドが実際に呼び出されたかどうかをテストするための模擬テストを行います。

+2

Hrm。私が、これをユニットテストではなく統合テストの分野に押しつける外部データソースを持っていなければならない場合は、その場合、すべてのテスト実行時にリセットする必要がある完全SQLデータベースではなく、SqlLite(http://stackoverflow.com/a/38630232/3691973)のようなもので何ができるかを見ていきます。これをまだ完全に内部的な方法ではないように見えるので、これを答えとしてマークします。 DataSetsが利用可能になった場合に、これがより簡単になることを願っています。これは、Dapper + .netコアを使用した場合の重大な問題のようです。 – Necoras

+1

@Necoras testing sqlは、基本的に常に統合テストです。しかし、はい、sqlのliteは良い選択肢です。しかし、あなたが使用するなら、sqlLiteでサポートされていない機能や、異なる動作をする可能性があることを知っています。これは、プロダクション環境の適切な表示を提供しません。 –

+0

ええ、私はそれが私たちの生産システムと少し異なって機能するかもしれないことを知っています。それは私がより直接的な記憶表現を望んでいた理由です。ありがたいことに私たちのSQLのほとんどはかなり簡単です。私たちのユースケースでは、SqLiteとSql Serverの間に大きな相違の問題はないことを願っています。 – Necoras

関連する問題