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

标签 c# entity-framework unit-testing mocking moq

我正在使用 Moq 编写使用 Entity Framework 6 的单元测试 DbSetDbContext对象。我有一个级联/多级服务方法 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 而不是字符串的调用,所以现在我有两个问题:

  1. 如何使用接受 lambda 的 Include 设置模拟?
  2. 上述设置是否会级联到多个级别?

最佳答案

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/

相关文章:

c# - 如何使用 UnitsNet nuget 包中的 Parse() 方法

c# - 在 Entity Framework 6.1(非 Core)中,如何使用 IndexAttribute 来定义聚簇索引?

javascript - 需要模型的 Ember 测试初始化​​器

c# - 如何在 MVC Core 中动态选择 Controller

c# - 无法从 BlobItem 检索元数据

c# - 简单的数据库处理

c# - 防止多个线程/实例选择和处理 Azure SQL 数据库中的相同行

entity-framework - 了解多对多关系和 Entity Framework

unit-testing - 如何在单元测试中测试功能行为?

unit-testing - 用 Jasmine 测试 AngularJS 工厂函数