模拟实体框架IQueryable,其中属性是具有InverseProperty的导航属性

时间:2018-07-19 11:03:11

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

我遇到了一个有趣的问题,当尝试模拟实体进行单元测试时无法解决。我有一个通用的存储库IMyRepoistory,可以返回IQueryable。我有2个具有多对多关系的对象,这是通过在两边都使用[InverseProperty()]属性来定义的。

public class EntityA
{
   public string Filter {get;set;}

   [InverseProperty("EntityAs")]
   public virtual ICollection<EntityB> EntityBs {get;set;}
}

public class EntityB
{
   [InverseProperty("EntityBs")]
   public virtual ICollection<EntityA> EntityAs {get;set;}
}

SQL中的基础数据模型很好,它可以在它们之间创建一个表。

在应用程序中,用于A和B的通用存储库都用于返回IQueryable,然后将它们用于LINQ查询中以有效地跨数据连接;

IQueryable<EntityA> entityAQueryable = entityARepository.GetQueryable();
IQueryable<EntityB> entityBQueryable = entityBRepository.GetQueryable();

var myEntities = (from a in entityAQueryable
                  from b in entityBQueryable
                  where a.Filter = myFilterVariable
                  ...)
                  .ToList();

到目前为止-很好。

但是,如果我想创建用于单元测试的模拟数据集,则可以创建EntityA的集合和EntityB的集合,但是存储库的IQueryable的模拟部分只能返回所有列表单一类型的实体。即使在查询的位置应用条件,两个集合中的所有项目也会返回。

如何像查询SQL中那样应用实际的联接,如何查询每个IQueryable?

编辑: 经过更多的思考-我意识到也许问题是我正在以一种实际上不存在的方式创建数据集。我的意思是,如果我在对SQL Server(而不是模拟服务器)执行此操作,则数据集将包含我期望的数据。但是,我认为我是通过使模拟数据集过于复杂来引入此问题的。

有想法吗?

0 个答案:

没有答案