使用 NUnit 断言集合中的所有项目都具有其中一项 属性 的值
Assert that all items in a collection have the value for one of the items property using NUnit
我必须将 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...”必须有助于 "non-programmers" 和你的代码摆脱"magic" 个数字
var value = collection.Select(item => item.location.id).FirstOrDefault();
Assert.That(collection.Select(item => item.location.id), Is.All.EqualTo(value));
如果我明白你想做什么...这应该可以...
Assert.That(collection.Select(() => item.location.id), Is.Unique);
在这里留下这个错误的答案...有人可能想测试唯一性,但这不是这个人想要的!!!
根据您的示例中的数据,注意到 name
等于 Id
,您可以使用:
var distinctLocations = collection.select(item => item.location).Distinct();
Assert.That(distinctLocations, Has.Exactly(1).Items);
如果该假设不正确,您当然只需要提取 id
。
我必须将 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...”必须有助于 "non-programmers" 和你的代码摆脱"magic" 个数字
var value = collection.Select(item => item.location.id).FirstOrDefault();
Assert.That(collection.Select(item => item.location.id), Is.All.EqualTo(value));
如果我明白你想做什么...这应该可以...
Assert.That(collection.Select(() => item.location.id), Is.Unique);
在这里留下这个错误的答案...有人可能想测试唯一性,但这不是这个人想要的!!!
根据您的示例中的数据,注意到 name
等于 Id
,您可以使用:
var distinctLocations = collection.select(item => item.location).Distinct();
Assert.That(distinctLocations, Has.Exactly(1).Items);
如果该假设不正确,您当然只需要提取 id
。