我遇到了一个有趣的问题,当尝试模拟实体进行单元测试时无法解决。我有一个通用的存储库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(而不是模拟服务器)执行此操作,则数据集将包含我期望的数据。但是,我认为我是通过使模拟数据集过于复杂来引入此问题的。
有想法吗?