この質問は、データ アクセスやリポジトリをテストする方法に関するものではありません。プロジェクトで(TDDで作成した)POCOクラスを使用したいときに発生する問題についてです。つまり、これは Linq to Entities の制限による問題です (または、クラスの設計に関する私の問題かもしれません)。
TDD を通じてたどり着いたクラスは次のとおりです (もちろん、非常に単純化されています)。
public class Person{
public int IdPerson{ get; set; }
public string Name { get; set; }
public int Average { get; set; }
}
public class Course{
public int IdCourse { get; set;}
public Person Professor { get; set;}
public IEnumerable<Person> Staff { get; set;}
public IEnumerable<Person> Students { get; set;}
public IEnumerable<Person> GetGreatStudents(){
return Students.Where(n => n.Average > 8);
}
}
シンプルですね。
それで... では、何が問題なのですか?見てみましょう...データベースからコースのすべてのデータを取得したい場合(コースクラスには現実モデルに多くのサブコレクションがあります) 、それらにフィルターを適用する場合、私ができる唯一の方法は次のようでした:
var course = from obj in Courses //Doesn't matter how i get the courses' collection
select {
IdCourse = obj.IdCourse,
GreatStudents = obj.GetGreatStudents(), // Here is the problem
OtherCollection = obj.OtherCollection.Where(n => n.Active).Select(n => n.Property1)
}
ご存じのとおり、 GetGreatStudents()関数が原因でエラーが返されます。
LINQ to Entities はメソッドを認識しません [...] このメソッドはストア式に変換できません。
つまり、メソッドを.Where(n => n.Average > 8)に直接置き換えることができることはわかっていますが、それはひどいものです (実際には多くのフィルターがあります)。ビルドしてテストした API を使用できない場合、TDD を使用しますか?
そこで私の質問は、TDD と Entity Framework を使用した開発経験のある方に、Linq to Entities を使用するときに、TDD を介して設計した美しい API をどのように使用できるでしょうか?