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);