在我的 C# 单元测试中,我经常根据 ID 列表查询行列表。然后我想确保 1) 对于所有 ID,至少找到一个具有该 ID 的行,并且 2) 对于所有返回的行,每一行都有一个 ID,该 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
andAll
对此类检查很方便,但我想看看是否有人认为这比它可能的可读性差,或者是否有更好的方法来进行这样的双向检查。我在 Visual Studio 2008 Team System 中使用 MSTest 进行单元测试。如果过于主观,这也许应该是社区 wiki。
编辑:我现在正在使用基于 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()
);