web-dev-qa-db-ja.com

モックDbSetにアイテムを追加する方法(Moqを使用)

テスト用に模擬DbSetをセットアップしようとしています。ここでチュートリアルを使用しました、 http://www.loganfranken.com/blog/517/mocking-dbset-queries-in-ef6/ そして少しGetEnumeratorを呼び出すたびに新しい列挙子を返すように変更しました(私が抱えていた別の問題)。ただし、DbSetにアイテムを追加するのが困難です。

出力はpreCount = 3 postCount = 3です。ただし、precount = 3 postCount = 4になると予想しています。どんな助けでも大歓迎です。

static void Main(string[] args)
    {
        Debug.WriteLine("hello debug");

        List<string> stringList = new List<string>
        {
            "a", "b", "c"
        };

        DbSet<string> myDbSet = GetQueryableMockDbSet(stringList);
        int preCount = myDbSet.Count();
        myDbSet.Add("d");
        int postCount = myDbSet.Count();
        Debug.WriteLine("preCount = " + preCount + " postCount = " + postCount);
    }

    private static DbSet<T> GetQueryableMockDbSet<T>(List<T> sourceList) where T : class
    {
        var queryable = sourceList.AsQueryable();

        var dbSet = new Mock<DbSet<T>>();
        dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
        dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
        dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
        dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator());

        return dbSet.Object;
    }
41
user1080952

myDbSetDbSetの実際の実装ではなく、fakeであることを意味するモックであり、必要なすべてのメソッドに対して設定する必要があります。 Addは例外ではないため、必要なことを行うように設定する必要があります。そうでない場合は何もしません。

次のようなものを追加します。myDbSet.Add("d");が呼び出されると、「d」がリストに追加され、後で返されます。

dbSet.Setup(d => d.Add(It.IsAny<T>())).Callback<T>((s) => sourceList.Add(s));

完全なコード

private static DbSet<T> GetQueryableMockDbSet<T>(List<T> sourceList) where T : class
{
    var queryable = sourceList.AsQueryable();

    var dbSet = new Mock<DbSet<T>>();
    dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
    dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
    dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
    dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator());
    dbSet.Setup(d => d.Add(It.IsAny<T>())).Callback<T>((s) => sourceList.Add(s));

    return dbSet.Object;
}

出力

hello debug
preCount = 3 postCount = 4
98
dee