NUnit:字典断言

26
我希望你能提供一个在NUnit中断言两个字典是否相同的一行代码,即我想要下面代码的简洁版本:
public static void DictionaryAssert<T, U>(Dictionary<T, U> dictionaryResult, Dictionary<T, U> expectedResult)
{
    Assert.AreEqual(dictionaryResult.Count, expectedResult.Count);
    foreach (var aKey in expectedResult.Keys)
    {
        Assert.AreEqual(expectedResult[aKey], dictionaryResult[aKey]);
    }
}

当然,这并不难,但我找不到参考资料,你有什么想法吗?
3个回答

40

3
我认为它们只适用于IEnumerable?根据我的测试,字典似乎不起作用。 - Graviton
忘记添加了;就目前我的测试情况来看,CollectionAssert.AreEquivalent现在可以正常工作。 - Graviton
4
根据NUnit documentation的说法:“如果两个集合按照相同的顺序包含相同的对象,则AreEqual重载将成功。 AreEquivalent测试是否包含相同的对象,而不考虑顺序。” - allonhadaya
1
CollectionAssert.AreEquivalent 只有在键和值类型为结构体时才能正常工作。默认情况下,它使用引用相等性。如果这些泛型参数是引用类型,即使对象包含相同的数据(但不同的引用),断言也会失败。 - Yura
@Yura 引用相等性在结构类型上同样失败 - object.ReferenceEquals(1, 1) - 因此该解释不成立。 - user2864740
显示剩余2条评论

3
尝试使用 CollectionAssert.AreEqual CollecitonAssert.AreEquivalent。两者都将比较集合的项(而不是集合的引用),但是如之前所讨论的, 区别在于集合中项目的顺序:
  • AreEqual - 集合必须具有相同的计数,并以相同顺序包含完全相同的项。
  • AreEquivalent - 集合必须包含相同的项,但匹配可以是任何顺序。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接