如何模拟多个级别的DbSet.Include lambda?

AJ。

我正在使用Moq编写使用Entity Framework 6DbSetDbContext对象的单元测试我有一个级联/多级的服务方法,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)如何设置Moq来处理多个级别的Moq Include

编辑
好,所以事实证明我不能It.IsAny<string>用于Include使用lambda而不是字符串的调用,所以现在我有两个问题:

  1. 如何使用包含接受lambda的Include设置模拟?
  2. 上面的设置会级联到多个级别吗?
AJ。

因此,由于@Old Fox提醒我Moq无法与静态成员一起使用,因此我找到了一种使用Microsoft Fakes进行此操作的方法。填充可让您填充静态方法。我使用MoqMock<DbSet>为每个实体设置对象:

var carData = new List<Car>{new Car{ Trim = "Whatever" }};  
var mockCarSet = new Mock<DbSet<Car>>();
mockCarSet.As<IQueryable<Car>>().Setup(m => m.Provider).Returns(carData.Provider);
mockCarSet.As<IQueryable<Car>>().Setup(m => m.Expression).Returns(carData.Expression);
mockCarSet.As<IQueryable<Car>>().Setup(m => m.ElementType).Returns(carData.ElementType);
mockCarSet.As<IQueryable<Car>>().Setup(m => m.GetEnumerator()).Returns(carData.GetEnumerator);
var mockMakeSet = new Mock<DbSet<Make>>();
//do the same stuff as with Car for IQueryable Setup
var mockModelSet = new Mock<DbSet<Model>>();
//do the same stuff as with Car for IQueryable Setup
using(ShimsContext.Create())
{
    //hack to return the first, since this is all mock data anyway
    ShimModel.AllInstances.MakeGet = model => mockMakeSet.Object.First();
    ShimCar.AllInstances.ModelGet = car => mockModelSet.Object.First();
    //run the test
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章