【发布时间】:2020-10-15 12:06:49
【问题描述】:
我使用 LINQ to EF。
我有一个 Item 实体,它有一个 Purchases 集合。
并非所有物品都有购买。我想做一个 Select 查询,当商品没有购买时 - 它为 LastPurchaseQuantity(int?) 和 LastPurchaseDate(DateTime?) 返回 null。
我做了以下 LINQ SELECT 查询。
当我在 EF 的应用程序中运行它时,它会返回我想要的结果。但是当我尝试对其进行单元测试时 - 它返回 LastPurchaseQuantity 和 LastPurchaseDate 的默认值 - 最小日期和 0。
我应该如何优化我的查询,使其在 EF 和单元测试中的工作方式相同?它应该返回值或 null。
我想我不需要 FirstOrDefault,而是 FirstOrNull() 方法。
var query = _itemsRepository.All()
.Where(x => x.UserId == userId)
.Select(x => new ItemOverviewDto()
{
Id = x.Id,
Name = x.Name,
ReplenishmentPeriod = x.ReplenishmentPeriod,
NextReplenishmentDate = x.NextReplenishmentDate,
LastReplenishmentDate = x.Purchases
.OrderByDescending(y => y.ReplenishmentDate)
.Select(m => m.ReplenishmentDate)
.FirstOrDefault(),
LastReplenishmentQuantity = x.Purchases
.OrderByDescending(y => y.ReplenishmentDate)
.Select(m => m.Quantity)
.FirstOrDefault(),
});
return query.ToList();
编辑:对于我的单元测试,我通过了一个假的 IQueryable 集合。
var allItems = BuildItemsCollection();
ItemsRepositoryMock.Setup(x => x.All()).Returns(allItems);
【问题讨论】:
-
别这样,unittest 不是用来查询数据库的。为什么要在单元测试中从数据库中获取值?
-
我在单元测试中不使用数据库。我使用 Moq 将假的 IQueryable
- 集合传递给测试。
-
好的,然后添加您的单元测试代码并解释您如何模拟存储库。
-
我添加了单元测试的代码。
标签: c# entity-framework linq