c# - 使用 NUnit 断言集合中的所有项目都具有其中一个项目属性的值

标签 c# collections lambda nunit assert

我必须将 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()));

最佳答案

可读版本

int expectedCount = 1;
int actualCount = collection.Select(item => item.location.id)
                            .Distinct()
                            .Count()

Assert.AreEqual(expectedCount, actualCount);

我不确定,但你可以试试这个版本,其中短语“Is all equal to...”一定对“非程序员”有帮助,并且你的代码摆脱了“魔法”数字

var value = collection.Select(item => item.location.id).FirstOrDefault();
Assert.That(collection.Select(item => item.location.id), Is.All.EqualTo(value));

关于c# - 使用 NUnit 断言集合中的所有项目都具有其中一个项目属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38851040/

相关文章:

java - Lambda 表达式条件的代码覆盖率单元测试

c# - 在 C# 中检查堆栈大小

c# - 如何将用户控件属性绑定(bind)到其他属性?

java - 正确从列表中删除整数<Integer>

java - 如何创建一个实现 java.util.collections 的类

c++ - Lambda 捕获和内存管理

c# - 这是最小起订量的正确用法吗?

c# - 在 PowerShell 中使用带有重载算术运算符的自定义 .NET 类

java - 使用 java8 从两个 java 列表中获取唯一的用户定义对象

java - 为什么 Java 编译器不能从约束 Iterable< 中推断出 Iterable<String>?扩展 CharSequence> 和 () -> (Iterator<String>)