【发布时间】:2016-12-15 12:25:12
【问题描述】:
我必须将 MS 单元测试转换为 NUnit 并遇到此断言。
Assert.AreEqual(collection.Select(item => item.location.id).Distinct().Count(), 1);
我希望有一种优雅的方式来编写约束条件,但我一直找不到。我的解决方案是这样的,但我对此并不满意:
Expect(collection.Select(item => item.location.id).Distinct().Count(), Is.EqualTo(1));
有没有更好的方法来编写意图更清晰易读的断言? (使用Has.或Map(collection).)
编辑 2:
我刚刚意识到明确说明意图可能会有所帮助:
集合中的所有项目都具有相同的位置 ID(不知道该 ID 是什么)
编辑 1:
这是 JSON 集合的样子:
[{itemId=1, location={name="A", id=1}},
{itemId=2, location={name="A", id=1}},
{itemId=3, location={name="A", id=1}}]
distinct.count = 1 => 通过
[{itemId=1, location={name="A", id=1}},
{itemId=2, location={name="A", id=1}},
{itemId=4, location={name="B", id=2}}]
distinct.count = 2 => 失败
编辑 3:我的最终解决方案,基于 Fabio 的回答
IEnumerable<long?> locationIds = collection.Select(item => item.location.id);
Expect(locationIds, Has.All.EqualTo(locationIds.FirstOrDefault()));
【问题讨论】:
-
您希望所有项目都是独一无二的吗?你能发布一个集合可能是什么样子的例子吗?
-
我正在尝试理解这个断言的价值,调用 .Distinct 会自动为您去除所有重复项,您的结果将始终等于 1。
-
@MoeGhafari 好地方。事实上,唯一会失败的方法是如果列表为空,因为条件将始终为真。
-
@MoeGhafari 我刚刚添加了该系列的外观;这是为了确保所有物品都在同一个位置
-
@DrSchizo 在我的理解中
Select(item => item.location.id)将每个项目的位置 ID 投影为一个新列表,Distinct()将踢出所有重复项,然后 count 将返回集合中唯一位置 ID 的数量
标签: c# collections lambda nunit assert