0

以下のコードのように、基本的なケースの単体テストのポイントを理解しようとしています。このための単体テストを作成することは有益ですか? エンティティ フレームワークをテストしようとしているわけではありません。ラムダ式が本来の動作をすることを確認したいだけです...私たちの考えは、DIを使用してIQueryableである何かを渡すということです..実際にはEFになりますが、単体テストではPOCOオブジェクト/コレクションになります. これは理にかなっていますか?私たちは始めたばかりで、この基本的なコードを理解する前に概念を習得したいと考えています。

   public class CongressRepository
{
    CongressDb_DevEntities context = new CongressDb_DevEntities();

    CongressRepository(DbContext db)
    {
        context = (CongressDb_DevEntities) db;
    }

    public IQueryable<tMember> GetAllMembers
    {
        get { return context.tMembers; }
    }

    public IQueryable<tMember> GetVotingMembers
    {
        get { return context.tMembers.Where(x => x.age > 18); }
    }
}
4

3 に答える 3

5

EF は LINQ to Entities を使用しますが、EF をモックするときは LINQ to Objects に切り替えます。LINQ to Entities と LINQ to Objects には違いがあるため、これは単体テストに関して誤検知につながる可能性があります。統合テストがなければ、本番環境でこれらの違い/エラーのみが表示されます。

于 2013-10-18T21:09:10.127 に答える
2

コードを単体テストする理由の 1 つは、精度を確保することです...

あなたの例では、誰かが 18 歳の誕生日、またはそれから 19 歳の誕生日までのどの日にも投票できませんでした。私はそれが本当にあるべきだと思います:

public IQueryable<tMember> GetVotingMembers
{
    get { return context.tMembers.Where(x => x.age >= 18); }
}

合理的な成功値と失敗値の範囲をカバーする単体テストは、コードが意図したとおりに動作することを確認するのに役立ちます:-)


しかし、私たちが尋ねる理由を見つけようとしているのは、単体テストがどのように機能するかです。

それは本当の痛みになる可能性があります!EF6 が発表されたばかりで、DbContext のモックを作成しやすくなっていますが、現時点では多くのセットアップが必要です...

重要なことは、Linq-to-Etities と Linq-to-Objects には違いがあるため、単体テストと統合テストの両方が必要になるということです。

ブログや関連する質問はたくさんありますが、FakeDbSet をいくつかの google-fu の出発点として使用してください。

于 2013-10-18T20:55:57.133 に答える
1

DbContext を使用するオブジェクトを単体テストするには、それをインターフェイスとしてリポジトリ オブジェクトに挿入する必要があります。次の手順を実行します:

1.すべての DbContext プロパティを含むインターフェイスを作成し、そこから DbContext を派生させます。

 public interface ICongressDbContext {
    IDbSet<Member> Members { get; set; }
    // repeat for all dbsets
 }

2.コンストラクターで、このインターフェースをリポジトリーに提供します。これはあなたの依存性注入です:

 private ICongressDbContext context;
 public CongressRepository(ICongressDbContext context){
     this.context = context;
 }

Autofac などの依存性注入フレームワークを使用してコンテキストのインスタンスを渡すか、オブジェクトをインスタンス化するインスタンスを作成できます。

3. IDbSet の汎用実装を作成します: https://gist.github.com/LukeWinikates/1309447。これを FakeDbContext と呼びましょう。

4. これでモック可能なインターフェイスと汎用 DbSet 実装ができたので、モック DbContext とモック IDbSet を作成する準備が整いました。Moq を使用すると、次のようになります。

        var dataContext = new Mock<ICongressDbContext>();
        var members = new List<Member> { // create your test data here };
        // set up the mocked context to use your fake db set with test data
        dataContext.SetupProperty(c => c.Members, new FakeDbContext<Member>(members));

        var repository = new CongressRepository(dataContext.Object);

        // start writing your test methods here

これにより、DbContext 自体ではなく、DbContext を使用するオブジェクトがテストされます。
単体テストに加えて、実際の DbContext を使用する統合テストを作成する必要があります。IQueryable でサポートされているメソッドのうち、データベースへのアクセス時にはサポートされていないメソッドが多数あります。また、データ モデルがデータベースに正しくマップされていることも確認する必要があります。

これがあなたが始めるのに役立つことを願っています。

于 2013-10-18T21:57:15.543 に答える