現在、MVC4 アプリケーションでのリポジトリ実装の単体テストを作成しています。データ コンテキストをモックするために、この投稿からいくつかのアイデアを採用することから始めましたが、適切にモックすることさえ可能かどうか疑問に思ういくつかの制限を発見しましたIQueryable
。
特に、テストはパスしても本番環境でコードが失敗する状況をいくつか見てきましたが、この失敗の原因となる動作を模倣する方法を見つけることができませんでした。
たとえば、次のスニペットはPost
、定義済みのカテゴリ リストに含まれるエンティティを選択するために使用されます。
var posts = repository.GetEntities<Post>(); // Returns IQueryable<Post>
var categories = GetCategoriesInGroup("Post"); // Returns a fixed list of type Category
var filtered = posts.Where(p => categories.Any(c => c.Name == p.Category)).ToList();
私のテスト環境では、上記posts
の偽の実装を使用してモックを作成し、インスタンスの を作成して拡張メソッドを使用するように変換することも試みました。これらのアプローチは両方ともテスト条件下で機能しますが、コードは実際には本番環境で失敗します。ただし、次の例外があります。DbSet
List
Post
IQueryable
AsQueryable()
System.NotSupportedException : Unable to create a constant value of type 'Category'. Only primitive types or enumeration types are supported in this context.
このような LINQ の問題は簡単に修正できますが、実際の課題は、テスト環境で明らかにならないことを考えると、問題を見つけることです。
Entity Frameworkの実装の動作を模倣できると期待するのは非現実的IQueryable
ですか?
あなたのアイデアをありがとう、
ティム。