C#单元测试中的双向列表比较

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)

Avi*_* P. 4

您可以选择使用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)

  • `Count() == 0` 的更好替代方法是 `Any()`。 (2认同)