2016-08-09 44 views
1

我必须将MS单元测试转换为NUnit并且遇到此断言。断言集合中的所有项目都具有使用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是什么)


E DIT 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:我的最终解决方案的基础上,法比奥的回答

IEnumerable<long?> locationIds = collection.Select(item => item.location.id); 
Expect(locationIds, Has.All.EqualTo(locationIds.FirstOrDefault())); 
+0

您期待所有项目都是唯一的吗?你能举一个集合可能是什么样子的例子吗? –

+0

我试图理解这个断言的价值,调用.Distinct会自动去除所有重复对象,你的结果将永远等于1. –

+0

@MoeGhafari好点。事实上唯一的办法是失败的是,如果列表是空的,条件将始终成立。 –

回答

2

可读的版本

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

遗憾,但对我来说,是不是好点;我希望能够使用NUnit约束API,而不仅仅是重新设置lambda表达式的格式,我想要一个非程序员可以阅读和理解的东西 – Holly

+0

似乎上面是最简单的。请参阅Mark Seeman的回答http://stackoverflow.com/a/32936435/1134076 –

+0

@Holly,Is.All.EqualTo是另一种声明集合包含具有相同'location.id'的项目的方法。有'Has.Exact'约束可以用于不同值的计数 – Fabio

0

如果我知道你想要做的......这应该去做什么......

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

离开这里这个错误的答案......有人可能要测试的独特性,但是这不是什么这家伙想要!

+0

哦,等一下!我没有明白。你想要独特的相反。 :-) – Charlie

+0

这实际上是流利的语法上的差距,虽然这不是任何人多年来所要求的,所以可能不是什么大不了的。随意请求一项功能。 – Charlie

+0

我也需要这个功能。 Is.All.Not.Unique错了吗? – wishmaster35

相关问题