【发布时间】:2014-03-28 06:58:19
【问题描述】:
我正在尝试模拟 System.Data.Entity.IDbSet 以使其返回一些数据(在这种情况下只是一个空集合):
var mock = new Mock<IDbSet<Setting>>();
mock.Setup(x => x.GetEnumerator()).Returns(Enumerable.Empty<Setting>().GetEnumerator());
var myEnumerator = mock.Object.GetEnumerator();
var count = mock.Object.Count();
这里 myEnumerator 将有一个非空值,正如预期的那样,但 mock.Object.Count() 会抛出一个 ArgumentNullException
System.ArgumentNullException : Value cannot be null.
Parameter name: arguments
at System.Linq.Expressions.Expression.RequiresCanRead(Expression expression, String paramName)
at System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi)
at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ref ReadOnlyCollection`1 arguments)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments)
at System.Linq.Queryable.Count(IQueryable`1 source)
如果我用 IEnumerable 替换 IDbSet,它会按预期工作(计数为零)。为什么 IDbSet 没有像我预期的那样被嘲笑?
编辑
看起来 LINQ 尝试使用 IQueryable 接口,因为它有效:
var mock = new Mock<IDbSet<Setting>>();
var myQueryable = Enumerable.Empty<Setting>().AsQueryable();
mock.Setup(m => m.Provider).Returns(myQueryable.Provider);
mock.Setup(m => m.Expression).Returns(myQueryable.Expression);
mock.Setup(m => m.GetEnumerator()).Returns(myQueryable.GetEnumerator());
var count = mock.Object.Count();
【问题讨论】:
标签: c# linq entity-framework moq