如果我有Dictionary<string, int> actual
,然后使用与实际值相同的值创建一个全新的Dictionary<string, int> expected
。
调用Assert.That(actual, Is.EqualTo(expected));
会使测试通过。
使用Assert.That(actual, Is.EquivalentTo(expected));
时,测试未通过。
EqualTo()
和EquivalentTo()
之间的区别是什么?
编辑:
测试未通过时异常的消息如下:
Zoozle.Tests.Unit.PredictionTests.ReturnsDriversSelectedMoreThanOnceAndTheirPositions:
Expected: equivalent to < [Michael Schumacher, System.Collections.Generic.List`1[System.Int32]] >
But was: < [Michael Schumacher, System.Collections.Generic.List`1[System.Int32]] >
我的代码如下所示:
[Test]
public void ReturnsDriversSelectedMoreThanOnceAndTheirPositions()
{
//arrange
Prediction prediction = new Prediction();
Dictionary<string, List<int>> expected = new Dictionary<string, List<int>>()
{
{ "Michael Schumacher", new List<int> { 1, 2 } }
};
//act
var actual = prediction.CheckForDriversSelectedMoreThanOnce();
//assert
//Assert.That(actual, Is.EqualTo(expected));
Assert.That(actual, Is.EquivalentTo(expected));
}
public Dictionary<string, List<int>> CheckForDriversSelectedMoreThanOnce()
{
Dictionary<string, List<int>> expected = new Dictionary<string, List<int>>();
expected.Add("Michael Schumacher", new List<int> { 1, 2 });
return expected;
}
答案 0 :(得分:9)
问题标题迫使我说明以下内容:
对于枚举,Is.EquivalentTo()
进行比较,允许任何元素顺序。
相比之下,Is.EqualTo()
会考虑元素的确切顺序,例如Enumerable.SequenceEqual()
。
但是,在您的情况下,订购没有问题。这里的要点是Is.EqualTo()
有额外的字典比较代码,如here所述。
不是Is.EquivalentTo()
。在您的示例中,它将使用KeyValuePair<string,List<int>>
比较类型object.Equals()
的值是否相等。由于字典值的引用类型为List<int>
,因此引用相等性用于比较它们。
如果您修改示例,使List {1,2}仅实例化一次并在两个词典中使用,Is.EquivalentTo()
将成功。
答案 1 :(得分:2)
两者都适合我:
var actual = new Dictionary<string, int> { { "1", 1 }, { "2", 2 } };
var expected = new Dictionary<string, int> { { "1", 1 }, { "2", 2 } };
Assert.That(actual, Is.EqualTo(expected)); // passed
Assert.That(actual, Is.EquivalentTo(expected)); // passed
Is.EqualTo()
,如果两个对象都是ICollection
,则使用CollectionsEqual(x,y)
迭代两者来查找差异。我想它等于Enumerable.SequenceEqual(x,y)
Is.EquivalentTo
立即执行此操作,因为仅支持序列:EquivalentTo(IEnumerable)