【发布时间】:2014-05-26 16:34:58
【问题描述】:
我的数据库中有一些varbinary 表列,我需要用字节数组测试它们是否相等,所有这些都通过实体框架和Linq-to-Entities 发生。对于 Linq-to-Objects,这很容易通过 SequenceEquals 扩展方法实现,但不幸的是 EF 不支持它,因此我依赖正确转换为 SQL 查询的 == 运算符。
例如
byte[] deviceId = GetDeviceId();
Device device = _deviceRepository.QueryAll() //backed by a DbContext, returns IQueryable<Device>
.Include(d => d.RelatedEntity1)
.Include(d => d.RelatedEntity2)
.Include(d => d.RelatedEntityEtc)
.FirstOrDefault(d => d.DeviceUniqueIdentifier == deviceId && ...);
LoginUserOnDevice(device);
但是,问题是,在对涉及 Linq-to-Entities 查询的代码段进行单元测试时,使用伪造的 _deviceRepository,我使用普通的 List<T> 通过 .AsQueryable() 转换为 @ 987654328@,相等运算符应用其原始语义,即引用相等,因此比较显然失败。当然,严格来说,这不会发生在单元测试中,而是在不再针对 SQL 数据源执行 linq 查询的任何情况下。
这里的最佳方法是什么?最好不更改查询代码,以便在查询真实数据库(使用 EF 6)和单元测试时都能正确运行。在我的场景中,通过在 Includes 之后调用 .ToList() 或类似的任何内容将整个集合具体化到内存中是不可能的。
【问题讨论】:
标签: c# .net entity-framework unit-testing linq-to-entities