【问题标题】:Assert that all items in a collection have the value for one of the items property using NUnit断言集合中的所有项目都具有使用 NUnit 的项目属性之一的值
【发布时间】: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 =&gt; item.location.id) 将每个项目的位置 ID 投影为一个新列表,Distinct() 将踢出所有重复项,然后 count 将返回集合中唯一位置 ID 的数量

标签: c# collections lambda nunit assert


【解决方案1】:

可读版本

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));

【讨论】:

  • 对不起,但对我来说,这并没有更好;我希望使用 NUnit 约束 API 不仅仅是重新格式化那个 lambda 表达式,我想要一个非程序员可以阅读和理解的东西
  • 好像上面是最简单的。查看 Mark Seeman 的回答 stackoverflow.com/a/32936435/1134076
  • @Holly, Is.All.EqualTo 是另一种断言集合包含具有相同location.id 的项目的方法。有Has.Exact约束可用于不同值的计数
  • @Fabio 好吧,这两个是我的第一个猜测,这就是我想要的;问题是,我不知道位置 ID 需要等于的值,只是所有位置 ID 必须相同
  • @Fabio 我想你的第二个答案是我能得到的最接近的答案,虽然我不喜欢做两次相同的投影,所以我稍微改变了一下 - 请参阅我的第三次编辑 - 谢谢
【解决方案2】:

如果我明白你想做什么......这应该做......

Assert.That(collection.Select(() => item.location.id), Is.Unique);

在这里留下这个错误的答案...有人可能想测试唯一性,但这不是这个人想要的!!!

【讨论】:

  • 哦等等!我不明白。你想要独特的反面。 :-)
  • 这实际上是流利语法中的一个差距,尽管多年来没有人要求这样做,所以可能没什么大不了的。随意请求功能。
  • 我也需要这个功能。 'Is.All.Not.Unique' 错了吗?
  • 这就是我今天要找的东西 ;)
【解决方案3】:

根据您示例中的数据,注意到name 相等,而Id 相等,您可以使用:

var distinctLocations = collection.select(item => item.location).Distinct();

Assert.That(distinctLocations, Has.Exactly(1).Items);

如果该假设不正确,您当然只需要提取 id

【讨论】:

    猜你喜欢
    • 2021-05-05
    • 2023-03-04
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2013-07-13
    • 2013-05-15
    相关资源
    最近更新 更多