我正在使用 Moq 编写使用 Entity Framework 6 的单元测试 DbSet
和 DbContext
对象。我有一个级联/多级服务方法 Include
而且我不知道如何设置它进行测试。服务方法看起来像这样:
return DataContext.Cars
.Include(p => p.Model)
.Include(p => p.Model.Make)
.Select(c => new
{
Key = c.CarId,
Value = string.Format("{0} {1} {2}", c.Model.Make.Name, c.Model.Name, c.Trim)
}
).ToArray();
我知道我必须设置 Include
返回模拟对象,像这样:
mockCarDbSet.Setup(m => m.Include(It.IsAny<string>())).Returns(mockCarSet.Object);
但是我从级联 .Include(p => p.Model.Make)
中得到一个空引用异常.如何设置起订量以处理多个级别的 Include
?
编辑
好的,事实证明我不能使用 It.IsAny<string>
对于 Include
使用 lambdas 而不是字符串的调用,所以现在我有两个问题:
- 如何使用接受 lambda 的 Include 设置模拟?
- 上述设置是否会级联到多个级别?
最佳答案
include()
是一个静态方法(扩展方法)。
Moq
不支持静态方法模拟(read this link)。
要测试您的代码,您需要设置 mockCarDbSet
返回 IQueryable<Car>
:
var carQuery = new List<Car>
{
//add cars
}
IQueryable<Post> query = carQuery.AsQueryable();
返回query
由于 DataContext.Cars
这些步骤将解决静态方法问题。
关于c# - 如何模拟多个级别的 DbSet.Include lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30850176/