为什么单元测试Assert.AreEqual()方法未在自定义类中使用我自己的Equals()方法

时间:2019-05-10 04:04:29

标签: c# .net unit-testing

我正在尝试为.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。

1 个答案:

答案 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);
        }
    }