データベース内のデータに基づいてツリーを構築するために使用される再帰関数をテストしています。この質問の目的のために、エンティティには独自のエンティティ ID とその親の ID があると仮定してください。
再帰関数を呼び出すたびに、これがリポジトリに対して実行されます。
List<MyEntity> children = dsService.GetMany<MyEntity>(x => x.ParentId == currentId)
通常、リポジトリをモックして、次のように設定します。
dsService.GetMany<MyEntity>(x => x.ParentId == 1).Returns(new List<MyEntity> { });
dsService.GetMany<MyEntity>(x => x.ParentId == 2).Returns(new List<MyEntity> { myentity, myotherentity});
ただし、NSubstitute (および簡単なグーグル検索に基づく他のモッキング フレームワークですが、私が完全ではなかったことを認めます) は LINQ クエリに問題があり、クエリがまったく同じでない限り、何を返すかを決定するためにそれを使用することはできません (同じ変数名、同じ順序など)。また、(パラメータに関係なく) GetMany への最初の関数呼び出しを設定して、あるものを返し、2 番目の関数呼び出しを別のものを返すように設定できることも確認しました。
最初のアプローチでは、関数呼び出し/ツリートラバーサルが常にまったく同じ順序であると想定されているため、これらのアプローチはどちらもあまり好きではありません (実際にこれを読んでいると、ループになっているため、 currentId を毎回変数名として使用しているため、呼び出しを区別する方法がないため機能しません)、2番目のものは、変数の順序、変数の名前などがまったく同じであると想定しています. このような場合、リファクタリングによって単体テストが壊れる可能性があります。
では、ここで最善のアプローチは何ですか?このようなラムダを処理できるモック フレームワークはありますか? 単体テストでクエリを実行して関連する結果を返すために、リストを含む偽のリポジトリを作成する最善の方法はありますか? まったく別の何か?