1

この質問は、データ アクセスやリポジトリをテストする方法に関するものではありません。プロジェクトで(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 をどのように使用できるでしょうか?

4

1 に答える 1

1

まず、これが TDD の問題であることに同意します (TDD を使用しているときに問題に遭遇するためです!)

あなたが抱えている問題は、永続性の無視を達成できなかったことです。あなたのエンティティはSQLに関連付けられています(したがって、特定のフレームワークに関連付けられているため、厳密に言えばPOCOではないと主張します)

この問題に対して私が見つけた唯一の解決策は、ドメイン モデル オブジェクトを永続モデル オブジェクト (つまり EF オブジェクト) から分離し、ドメイン オブジェクトから永続オブジェクトにマップできるライブラリを作成することでした。これは大変な作業であり、小さなプロジェクトにとって価値があるかどうかは疑問です. 純粋主義の前にプラグマティズムを置くと、ユニットテストを書くことはできても、EF でそのようなことを行うことができないことを単純に理解するのははるかに簡単になります (ただし満足度は低くなります)。

少し一方的ではありますが、これこれが役立つことがわかりました。

あなたの質問は古い投稿なので、より良い方法を見つけたらぜひ聞いてください。

于 2016-11-11T13:56:46.760 に答える