我正在尝试为.Net Framework类库项目构建一个单元测试项目。我有一些定制的模型类型,它们在要测试的项目中实现了IEquatable<T>
接口并具有自己的Equals()
方法。
我在线阅读了几篇文档,他们说Assert.AreEqual
方法仅在对象没有自己的RefereceEqual
方法时才运行Equals()
。但是我发现,即使对象具有自己的Equals
方法,TestMethod仍然不会返回true。我使用一个简单的示例重新创建了以下场景。我做错什么了吗?
namespace Demo
{
public class MyDog : IEquatable<MyDog>
{
public string Name;
public int Age;
public bool Equals(MyDog other)
{
if (other == null) return false;
return (this.Name == other.Name) && (this.Age == other.Age);
}
}
}
namespace DemoTest
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void MyDogTest()
{
var dog1 = new MyDog { Age = 10, Name = "Jack" };
var dog2 = new MyDog { Age = 10, Name = "Jack" };
Assert.AreEqual(dog1, dog2);
}
}
}
dog1.Equals(dog2)
将返回true,而单元测试将失败。如何在Test方法中正确比较dog1和dog2。
答案 0 :(得分:2)
在幕后,Assert.AreEqual方法使用object.Equals比较这两个对象。因此,如果您将代码更新为类似
public class MyDog
{
public string Name;
public int Age;
public override bool Equals(object obj)
{
if (!(obj is MyDog other)) return false;
return (this.Name == other.Name) && (this.Age == other.Age);
}
}