我有一个方法将我的实体框架实体转换为 DTO 对象。在这种方法中,我有参数可以跳过并限制要返回的相关项目的数量。对于小数据集,这样的简单查询效果很好:
var query = this.AccessLogs
.Skip(skipRelated)
.Take(takeRelated);
对于更大的数据集,我发现这实际上在我的数据库中执行了 SELECT * 并导致了很多问题,因为在某些情况下我有数百万条相关记录。问完这个问题后,我将查询修改为:
var query = this.AccessLogs
.CreateSourceQuery()
.OrderBy(p => p.ID)
.Skip(skipRelated)
.Take(takeRelated);
现在,虽然这解决了我在集成测试期间遇到的性能问题,但这会导致我的每一个单元测试都失败,因为.CreateSourceQuery()
返回 null 然后我的.OrderBy()
barfs 参数名称为 ArgumentNullException:source。
我有一个返回的存储库,IQueryable<T>
并且我有依赖注入设置来对其进行单元测试,所以我正在设置这样的“测试”数据。最初我只是在使用List<T>
,但我发现这篇文章使用了InMemoryObjectSet<T>
用于测试。.CreateSourceQuery()
无论哪种方式,即使基础集合中有数据,我的调用也会返回 null。
IObjectSet<Parent> ret = new InMemoryObjectSet<Parent>();
var parent = new Parent();
parent.ID = 1;
parent.Name = "Name 1";
for(int i = 0; i < 5; i++)
{
var ch = new Child();
ch.ID = i;
ch.ParentID = 1;
ch.Property1 = "Name " + i.ToString();
parent .Children.Add(ch);
}
ret.AddObject(parent);
我的问题是:如何设置单元测试的测试数据,以便.CreateSourceQuery()
不返回 null?