Wie zum Hohn die Grenzen von Entity Framework ist die Implementierung von IQueryable

Ich bin derzeit am schreiben von unit tests für meine repository-Implementierung in einem MVC4 Anwendung. Um zu verspotten die Daten Kontext, ich begann durch die Annahme einige Ideen aus dieser Beitrag, aber ich habe jetzt entdeckt, einige Einschränkungen zu machen, dass sich mir die Frage, ob es überhaupt möglich richtig zu mock IQueryable.

Insbesondere habe ich einige Situationen, in denen die tests übergeben, aber der code nicht in der Produktion, und ich habe nicht in der Lage gewesen zu finden, jeden Weg zu verspotten, das Verhalten, die Ursachen dieser Fehler.

Beispielsweise den folgenden Codeausschnitt wird verwendet, um wählen Sie Post Entitäten, die sich innerhalb einer vordefinierten Liste von Kategorien:

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();

In meiner Testumgebung, ich habe versucht, Spott posts mit dem fake DbSet Umsetzung oben erwähnt, und auch durch die Schaffung einer List von Post Instanzen und deren Umwandlung in IQueryable mit der AsQueryable() - Erweiterung-Methode. Beide Ansätze arbeiten unter Bedingungen testen, aber der code nicht wirklich in der Produktion, mit der folgenden Ausnahme:


System.NotSupportedException : Unable to create a constant value of type 'Category'. Only primitive types or enumeration types are supported in this context.

Obwohl LINQ Fragen wie diese sind einfach genug zu lösen, die wirkliche Herausforderung ist, Sie zu finden, da Sie sich nicht offenbaren sich in der test-Umgebung.

Bin ich unrealistisch, zu erwarten, dass ich verspotten das Verhalten von Entity Framework ist die Implementierung von IQueryable?

Vielen Dank für Eure Ideen,

Tim.

  • Es wird nicht eine unit-test-aber was, wenn Sie haben ToString() (auf der DbQuery) oder ToTraceString() (auf ObjectQuery)? Es wird dump der SqlQuery entsprechend Ihrer Abfrage-Bedeutung, die Sie gehen Sie durch die ganze EF-Abfrage pipeline, aber nicht senden Sie die Abfrage an die Datenbank. Es sollte zeigen Fälle wie diese.
  • Vielen Dank - das ist ein großer Schritt in die richtige Richtung, obwohl es wäre schön, wenn ich könnte irgendwie automatisieren.
InformationsquelleAutor Tim Coulter | 2012-11-11
Schreibe einen Kommentar