在我的C#单元测试中,我经常根据ID列表查询一组行。然后我想确保:1)对于所有的ID,至少找到了一个具有该ID的行;2)对于返回的所有行,每个行都有一个在要查找的ID列表中的ID。这是我通常使用的方法:
我认为使用
Assert.IsTrue(ids.All(
id => results.Any(result => result[primaryKey].Equals(id))
), "Not all IDs were found in returned results");
Assert.IsTrue(results.All(
result => ids.Any(id => result[primaryKey].Equals(id))
), "Returned results had unexpected IDs");
我认为使用
Any
和All
对于这种检查很方便,但我想知道是否有人认为这可能不够易读,或者是否有更好的方式来做类似的双向检查。我在使用Visual Studio 2008 Team System中的MSTest进行单元测试。如果这太主观了,那么这可能应该是社区维基。
编辑: 我现在正在使用基于Aviad P.建议的解决方案,并且以下测试也通过了:string[] ids1 = { "a", "b", "c" };
string[] ids2 = { "b", "c", "d", "e" };
string[] ids3 = { "c", "a", "b" };
Assert.AreEqual(
1,
ids1.Except(ids2).Count()
);
Assert.AreEqual(
2,
ids2.Except(ids1).Count()
);
Assert.AreEqual(
0,
ids1.Except(ids3).Count()
);
x [primaryKey]
的方式。然而,鉴于Except
的描述,我认为它应该是Count() == 0
。 - Sarah Vessels>0
?我期望检索到的结果ID列表和我查询的ID列表没有区别。Intellisense将Except
描述为生成“两个序列的集合差异”。 - Sarah VesselsAny()
是比Count() == 0
更好的选择。 - Mark SeemannAssert.AreEqual
与Count()
和0
,而不是使用Count() == 0
或Any()
。 - Sarah Vessels