覆盖等于方法和单元测试

时间:2013-01-19 19:35:02

标签: c# unit-testing

这是单元测试的第一次尝试。我的.Equals方法在TestSet_Equals_TrueTestSet_Equals_True_Shuffled_Order失败。希望澄清这是否是我单位测试的问题或我的.Equals方法有问题。

单元测试:

private void Populate(Set set, int count)
{
    for (int i = 0; i < count; ++i)
        set.Add(i);
}

[TestMethod]
public void TestSet_Equals_True()
{
    Set set1 = new Set();
    Set set2 = new Set();

    Populate(set1, POPULATE_COUNT);
    Populate(set2, POPULATE_COUNT);
    bool expected = true;
    bool actual = set1.Equals(set2);
    Assert.AreEqual(expected, actual);
}

类别:

List<object> _set;

//Override Equals
public override bool Equals(object obj)
{
if (this.GetType() != obj.GetType())
    return false;
Set o = (Set)obj;

if (this._set.Count != o._set.Count)
    return false;

o._set.Sort();
this._set.Sort();

return _set.Equals(o._set); }

3 个答案:

答案 0 :(得分:3)

List<T> Equals的实现是object.Equals的默认实现 - 参考平等。

要查看两个IEnumerable<T>是否相等,可以使用扩展方法IEnumerable<T>.SequenceEquals - 不要忘记为using命名空间添加System.Linq语句。

祝你好运。

答案 1 :(得分:1)

首先,不要在同等方法中对您的集合进行排序。 Equals不应以任何方式更改您的对象。它应该只确定2个对象是否相同。

您可以使用SequenceEquals但确实意识到SequenceEquals无法处理NullReferenceExceptions

所以我认为问题在于你的Equals实现。也许你可以尝试这样的事情:

    public override bool Equals(object obj)
    {
        var isEqual = false;

        var otherSet = obj as Set;

        if (otherSet != null)
        {
            isEqual = _set.Count == otherSet.Count;
            isEqual &= _set.SequenceEqual(otherSet);
        }

        return isEqual;
    }

答案 2 :(得分:0)

您可以删除Sort中的Equals来电。我不知道他们服务的目的是什么,他们不应该在Equals实施中。列表Equals只是引用相等。您可以使用SequenceEquals扩展方法IEnumerable<T>来检查此处的相等性:

var a = new List<int> {1, 2};
var b = new List<int> {1, 2};

Assert.False(a.Equals(b));
Assert.True(a.SequenceEqual(b));
相关问题