web-dev-qa-db-ja.com

EF DbContextの一部をMoqやInMemoryDbSetでモックする

この質問は[〜#〜]ではない[〜#〜]ここにあるものについて: https://stackoverflow.com/questions/25960192/mocking-ef-dbcontext-with-moq および/または同様の質問。私はそれをよく知っています。返信する前に質問を読んでください。ありがとう。

  1. 「ビジネスオブジェクト」(トランザクションデータ)と呼ばれるものもあれば、「データオブジェクト」(業務データ)と呼ばれるものもあります。 「ビジネスオブジェクト」は通常、新しいユーザーリクエストごとに作成または更新され、「データオブジェクト」はかなり安定していますが、最初の呼び出しで欠落している場合は、ユーザーリクエスト中に作成されることがあります。

  2. sand boxで統合テストを作成したいのですが、実際のデータベースからdata objectsをプルすることができます(それらの数が多すぎるため、モック)が、ビジネスオブジェクトで何が起こるかを制御します。たとえば、get or createワークフロー(もちろん、検証を行います)を明示的にテストしますワークフロー全体他のいくつかのテストでgetまたはcreateワークフローを個別にテストした後。ただし、テストした場合get or createワークフローの場合、実際のDBではワークフローのcreate部分を1回しかテストできませんが、getワークフローのみをヒットします(オブジェクトは最初のテスト実行後に存在するため)。多くのテストが定期的に並行して実行され、結果が予測不能になることを考慮してください。

ほとんどのテーブルは実際のDBから取得されますが、テストごとにいくつかのテーブルをセットアップできるデータベースコンテキストのpartial "モック"を実行する適切なアプローチは何でしょうか。 InMemoryDbSets内。

私が見た最も実用的な方法は、データベースのスナップショットを使用して実際のデータベースを作成して元に戻すことです。

これは主題に関する記事です:

https://weblogs.sqlteam.com/mladenp/2007/07/06/60250/

テストまたは一連のテスト用にデータベースをセットアップし、スナップショットを保存します。テストを実行する前に、スナップショットを使用してDBを作成します。彼らが気になったら、必要に応じてデータベースを削除または元に戻すことができます。

エンティティフレームワークオブジェクトをモックしようとする必要はありません。ほとんどの目的で、リポジトリレイヤーを作成し、それを模擬する必要があります。しかし、これはリファクタリングが多すぎるように思えます。

DBのサイズに関するコメントを書き留めます。理想的には、スナップショットに単一のテストに必要なデータのみが含まれるようにする必要があります。ただし、テストごとに多数の小さなバージョンのDBを手動で設定することと、大きなブロックのテストに使用できる大きな「ライブからコピーされた」バージョンとの間の労力を判断する必要があります。

1
Ewan