テスト用に模擬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;
}
myDbSet
はDbSet
の実際の実装ではなく、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