【发布时间】:2012-01-30 02:52:55
【问题描述】:
我有一个方法将我的实体框架实体转换为 DTO 对象。在这种方法中,我有参数可以跳过并限制要返回的相关项目的数量。对于小数据集,这样的简单查询效果很好:
var query = this.AccessLogs
.Skip(skipRelated)
.Take(takeRelated);
对于更大的数据集,我发现这实际上在我的数据库中执行了 SELECT * 并导致了很多问题,因为在某些情况下我有数百万条相关记录。在询问this question 之后,我将查询修改为:
var query = this.AccessLogs
.CreateSourceQuery()
.OrderBy(p => p.ID)
.Skip(skipRelated)
.Take(takeRelated);
现在,虽然这解决了我在集成测试期间遇到的性能问题,但这会导致我的每一个单元测试都失败,因为 .CreateSourceQuery() 返回 null 然后我的 .OrderBy() barfs 在参数名称上带有 ArgumentNullException:source .
我有一个返回IQueryable<T> 的存储库,并且我有依赖注入设置来对其进行单元测试,所以我正在设置我的“测试”数据,就像这样。最初我只是使用List<T>,但我发现this article 使用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?
【问题讨论】:
标签: c# .net entity-framework unit-testing test-data