Sar*_*els 5 c# unit-testing coding-style readability
在我的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");
Run Code Online (Sandbox Code Playgroud)
我认为使用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()
);
Run Code Online (Sandbox Code Playgroud)
您可以选择使用Except
运算符:
var resultIds = results.Select(x => x[primaryKey]);
Assert.IsTrue(resultIds.Except(ids).Count() == 0,
"Returned results had unexpected IDs");
Assert.IsTrue(ids.Except(resultIds).Count() == 0,
"Not all IDs were found in returned results");
Run Code Online (Sandbox Code Playgroud)