2

データベース アクセスに Entity Framework 4.1 を使用しており、次のコードを単体テストしたいと考えています。

// Get all the entities including children
using (MyContext context = new MyContext())
{
    return context.EmployeeProfiles.Include("EmployeeProperties").ToList();
}

Moles を使用してデータベースの依存関係を掘り下げていますが、行き詰まっています。Entity Framework のどのポイントから始めるべきか。

私はこのに従っていましたが、これは LINQ-To-SQL 用です。

データベースへの呼び出しが行われる前に、どの関数をインターセプトするかを把握するために、Entity Framework をデバッグ/トレースすることも考えていました。ただし、Entity Framework 4.1 でトレースできるソース コードはないようです。ディスカッションを参照してください。

EmployeeProfiles のリストを取得できるように、DbContext でどの関数をモルアウトする必要があるかを誰かに案内してもらえますか?

4

2 に答える 2

0

リポジトリパターンを介してEFへの依存を削除するのではなく、EFの特定の動作を模倣しようとしているように見えます。私はそれをやろうとする意味がわかりません、そしてそれは非常に難しいでしょう、EFは嘲笑されることを意図されていません。

リポジトリはおそらく次のようなものです。

public interface IRepository
{
      IEnumerable<EmployeeProfiles> EmployeeProfiles { get; }
}

public class Repository
{
    public IEnumerable<EmployeeProfiles> EmployeeProfiles
    {
        get
        {
            // Get all the entities including children     
            using (MyContext context = new MyContext())     
            {
                return context.EmployeeProfiles.Include("EmployeeProperties").ToList();     
            }
        }
    }
}

このようにして、EmployeeProfilesが返される方法に対するリポジトリの依存関係を削除しました。これで、心ゆくまでモックアウェイできます(まだMolesを使用していません)が、Moqを使用すると、次のようになります。

public void TestEmptyList()
{
    var mock = new Mock<IRepository>();
    var expected = new List<EmployeeProfiles>();
    mock.SetupGet(ep => ep.EmployeeProfiles).Returns(expected);

    var actual = mock.Object.EmployeeProfiles;

    Assert.AreEqual(expected, actual);
}

したがって、データベースから抽象化するメソッド/プロパティをリポジトリインターフェイスに配置すると、テストする値をモックアウトして、返される可能性があります。

とにかくこれをやっているのかもしれませんが、よくわかりません。なぜEFをユニットテストしたいのかわかりませんが、何を得たいと思いますか?それは非常に難しいでしょう、それはモックされるように設計されていません(非常に少数のインターフェース/仮想)。あなたが返すデータのモックは、あなたが本当に興味を持っているすべてであり、上記のように行われます。

于 2011-11-17T15:43:15.620 に答える