この質問は[〜#〜]ではない[〜#〜]ここにあるものについて: https://stackoverflow.com/questions/25960192/mocking-ef-dbcontext-with-moq および/または同様の質問。私はそれをよく知っています。返信する前に質問を読んでください。ありがとう。
「ビジネスオブジェクト」(トランザクションデータ)と呼ばれるものもあれば、「データオブジェクト」(業務データ)と呼ばれるものもあります。 「ビジネスオブジェクト」は通常、新しいユーザーリクエストごとに作成または更新され、「データオブジェクト」はかなり安定していますが、最初の呼び出しで欠落している場合は、ユーザーリクエスト中に作成されることがあります。
sand boxで統合テストを作成したいのですが、実際のデータベースからdata objectsをプルすることができます(それらの数が多すぎるため、モック)が、ビジネスオブジェクトで何が起こるかを制御します。たとえば、get or create
ワークフロー(もちろん、検証を行います)を明示的にテストしますワークフロー全体他のいくつかのテストでget
またはcreate
ワークフローを個別にテストした後。ただし、テストした場合get or create
ワークフローの場合、実際のDBではワークフローのcreate
部分を1回しかテストできませんが、get
ワークフローのみをヒットします(オブジェクトは最初のテスト実行後に存在するため)。多くのテストが定期的に並行して実行され、結果が予測不能になることを考慮してください。
ほとんどのテーブルは実際のDBから取得されますが、テストごとにいくつかのテーブルをセットアップできるデータベースコンテキストのpartial "モック"を実行する適切なアプローチは何でしょうか。 InMemoryDbSet
s内。
私が見た最も実用的な方法は、データベースのスナップショットを使用して実際のデータベースを作成して元に戻すことです。
これは主題に関する記事です:
https://weblogs.sqlteam.com/mladenp/2007/07/06/60250/
テストまたは一連のテスト用にデータベースをセットアップし、スナップショットを保存します。テストを実行する前に、スナップショットを使用してDBを作成します。彼らが気になったら、必要に応じてデータベースを削除または元に戻すことができます。
エンティティフレームワークオブジェクトをモックしようとする必要はありません。ほとんどの目的で、リポジトリレイヤーを作成し、それを模擬する必要があります。しかし、これはリファクタリングが多すぎるように思えます。
DBのサイズに関するコメントを書き留めます。理想的には、スナップショットに単一のテストに必要なデータのみが含まれるようにする必要があります。ただし、テストごとに多数の小さなバージョンのDBを手動で設定することと、大きなブロックのテストに使用できる大きな「ライブからコピーされた」バージョンとの間の労力を判断する必要があります。