Dictionary NUnit:字典断言顺序

Dictionary NUnit:字典断言顺序,dictionary,nunit,Dictionary,Nunit,我对这本词典的收藏感到困惑。我已经完成了以下测试 [Test] public void DictionaryAssertTest() { const int count = 2; IDictionary<string, string> dictionary = new Dictionary<string, string>(); for (int i = 0; i < count; i++)

我对这本词典的收藏感到困惑。我已经完成了以下测试

    [Test]
    public void DictionaryAssertTest()
    {
        const int count = 2;

        IDictionary<string, string> dictionary = new Dictionary<string, string>();
        for (int i = 0; i < count; i++)
            dictionary.Add(i.ToString(), i.ToString());

        IDictionary<string, string> reversedictionary = new Dictionary<string, string>();
        for (int i = count -1; i >= 0 ; i--)
            reversedictionary.Add(i.ToString(), i.ToString());


        //NOTE: Expecting this to fail but does not
        CollectionAssert.AreEqual(dictionary, reversedictionary);

        //NOTE: When I first convert to List and then pass as parameter it fails 
        CollectionAssert.AreEqual(dictionary.ToList(), reversedictionary.ToList());
    }

简单回答:因为IDictionary(您的第一个断言)中元素的顺序与AreEqual约束无关,但IEnumerable(您的第二个断言)中元素的顺序是相关的

详情:

当两个参数都是IDictionary时,NUnit使用NUnitEqualityComparer.DictionariesEqual()方法来比较字典。此方法检查这两个字典是否具有相同的键集(在您的情况下,这是正确的,顺序并不重要),然后检查每个键对应的值是否相等

但当您首先调用.ToList()时,NUnit使用NUnitEqualityComparer.EnumerablesEqual()方法来比较对列表。此方法检查两个列表中相同位置的元素是否相等,这在您的案例中是不正确的-对(“0”;“0”)不等于对(“1”;“1”)

如果希望比较字典时考虑元素的顺序,可以做什么?两种方式:

1) 就像你现在做的那样,把它们都放到列表中

2) 实现IComparer接口并将其实例作为第三个参数传递给AreEqual assert:

CollectionAssert.AreEqual(dictionary, reversedictionary, myComparer);

你的解释通过提问得到澄清。谢谢
CollectionAssert.AreEqual(dictionary, reversedictionary, myComparer);