断言集合中的所有项目都使用NUnit

时间:2016-08-09 12:40:43

标签: 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()));

3 个答案:

答案 0 :(得分:3)

可读版本

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

Assert.AreEqual(expectedCount, actualCount);

我不确定但您可以尝试这个版本,其中短语“等于...... ”必须帮助“非程序员”并且您的代码摆脱“魔术”数字

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

根据您示例中的数据,注意nameId相等的位置相等,您可以使用:

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

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

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