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