单元测试中的对象比较

Bla*_*ell 13 .net mstest

我的单元测试中有两个对象,即实际和预期的对象.对象方法的所有属性都完全相同,如果我运行以下测试:

Assert.AreEqual( expectedObject.Property1, actualObject.Property1);
Run Code Online (Sandbox Code Playgroud)

结果按预期传递.但是,当我尝试运行以下测试时,它会失败:

Assert.AreEqual (expectedObject, actualObject);
Run Code Online (Sandbox Code Playgroud)

我错过了什么?可以不比较两个对象,我是否必须对每个属性进行检查?

jas*_*son 15

您需要覆盖Equals您的对象.Assert用途Object.Equals.默认情况下,Object.Equals在引用类型的对象上执行引用比较.也就是说,当且仅当它们引用同一对象时,引用类型的两个实例是相等的.您希望覆盖它,以便执行值比较而不是执行引用比较.这是一篇关于这个主题的非常好的MSDN文章.请注意,您还需要覆盖GetHashCode.请参阅MSDN 指南.这是一个简单的例子:

之前:

class Test {
    public int Value { get; set; }
}

Test first = new Test { Value = 17 };
Test second = new Test { Value = 17 };
Console.WriteLine(first.Equals(second)); // false
Run Code Online (Sandbox Code Playgroud)

后:

class Test {
    public int Value { get; set; }
    public override bool Equals(object obj) {
        Test other = obj as Test;
        if(other == null) {
            return false; 
        }
        return this.Value == other.Value;
    }
    public override int GetHashCode() { 
        return this.Value.GetHashCode();
    }
}

Test first = new Test { Value = 17 };
Test second = new Test { Value = 17 };
Console.WriteLine(first.Equals(second)); // true
Run Code Online (Sandbox Code Playgroud)

  • 注意平等污染.覆盖等于可能不是正确的做法.有关更多信息,请参见此处:http://stackoverflow.com/questions/2046121/how-to-compare-two-object-in-unit-test-how-to-compare-two-collection-in-unit-tes/ 2047576#2047576 (2认同)