问题描述
我试图嘲弄的DbContext和DbSet。这适用于我以前的单元测试,但而我的代码是呼吁DbSet第二次了ToList方法时发生问题。
首先dbSet.ToList()返回嘲笑的结果。
第二个返回0元素;
VAR queryableData =新的List<串> {A,B ,C} .AsQueryable();
变种mockDbSet =新的模拟< DbSet<串GT;>();
变种Q = mockDbSet.As<&IQueryable的LT;串GT;>();
q.Setup(M = GT; m.Provider).Returns(queryableData.Provider);
q.Setup(M = GT; m.Expression).Returns(queryableData.Expression);
q.Setup(M = GT; m.ElementType).Returns(queryableData.ElementType);
q.Setup(M = GT; m.GetEnumerator())返回(queryableData.GetEnumerator());
DbSet<串GT; dbset = mockDbSet.Object;
&IQueryable的LT;字符串>查询= dbset;
//结果:ABC
变种A1 = dbset.ToList();
的foreach(在A1 VAR一)
Console.Write(一);
//没有结果
VAR A2 = dbset.ToList();
的foreach(在A2变种一个)
Console.Write(一);
您在每次调用返回同样的枚举实例的GetEnumerator
。当它枚举一次,它完成,EF不会调用其重置
方法,而是要求一个新的枚举。
但你返回刚刚取得了所有的元素和产量没有更多的人。
相反,返回函数返回的枚举,将每次你问它时返回一个新的枚举。
q.Setup(M = GT ; m.GetEnumerator())返回(()=> queryableData.GetEnumerator());
I'm trying to mock DbContext and DbSet. This works for my previous unit tests, but problem occurs while my code was calling ToList method on DbSet second time.
First dbSet.ToList() returns mocked results.Second one returns 0 elements;
var queryableData = new List<string>{ "a", "b", "c" }.AsQueryable();
var mockDbSet = new Mock<DbSet<string>>();
var q = mockDbSet.As<IQueryable<string>>();
q.Setup(m => m.Provider).Returns(queryableData.Provider);
q.Setup(m => m.Expression).Returns(queryableData.Expression);
q.Setup(m => m.ElementType).Returns(queryableData.ElementType);
q.Setup(m => m.GetEnumerator()).Returns(queryableData.GetEnumerator());
DbSet<string> dbset = mockDbSet.Object;
IQueryable<string> query = dbset;
//RESULTS: abc
var a1 = dbset.ToList();
foreach (var a in a1)
Console.Write(a);
//NO RESULTS
var a2 = dbset.ToList();
foreach (var a in a2)
Console.Write(a);
You return the very same enumerator instance upon each call to GetEnumerator
. When it enumerates once, it is done, EF doesn't call its Reset
method, rather it asks for a new enumerator.
But you return the one that just has yielded all elements and yields no more.
Instead, return a function that returns the enumerator, that will return a new enumerator each time you ask for it.
q.Setup(m => m.GetEnumerator()).Returns( () => queryableData.GetEnumerator() );
这篇关于DbSet模拟,没有结果,而其次调用了ToList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!