使用NUnit声明集合中的所有项目都具有item属性之一的值

Hol*_*lly 3 c# collections lambda nunit assert

我必须将MS单元测试转换为NUnit并遇到此断言。

Assert.AreEqual(collection.Select(item => item.location.id).Distinct().Count(), 1);
Run Code Online (Sandbox Code Playgroud)

我希望会有一种优雅的方式来编写带有约束的内容,但我一直找不到。我的解决方案是这样,但是我对此并不满意:

Expect(collection.Select(item => item.location.id).Distinct().Count(), Is.EqualTo(1));
Run Code Online (Sandbox Code Playgroud)

在意图更易读的地方,有没有更好的方式写断言?(使用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}}]
Run Code Online (Sandbox Code Playgroud)

unique.count = 1 =>通过

[{itemId=1, location={name="A", id=1}},
 {itemId=2, location={name="A", id=1}},
 {itemId=4, location={name="B", id=2}}]
Run Code Online (Sandbox Code Playgroud)

unique.count = 2 =>失败

编辑3:根据Fabio的答案,我的最终解决方案

IEnumerable<long?> locationIds = collection.Select(item => item.location.id);
Expect(locationIds, Has.All.EqualTo(locationIds.FirstOrDefault()));
Run Code Online (Sandbox Code Playgroud)

Fab*_*bio 5

可读版本

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

Assert.AreEqual(expectedCount, actualCount);
Run Code Online (Sandbox Code Playgroud)

我不确定,但是您可以尝试使用此版本,其中的短语“ 全部等于... ”必须对“非程序员”有所帮助,并且您的代码摆脱了“魔术”数字

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


Cha*_*lie 5

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

Assert.That(collection.Select(() => item.location.id), Is.Unique);
Run Code Online (Sandbox Code Playgroud)

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

  • 等一下!我没看懂。你想要独特的反面。:-) (2认同)