Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么单元测试Assert.AreEqual()方法没有在自定义类中选择我自己的Equals()方法_C#_.net_Unit Testing - Fatal编程技术网

C# 为什么单元测试Assert.AreEqual()方法没有在自定义类中选择我自己的Equals()方法

C# 为什么单元测试Assert.AreEqual()方法没有在自定义类中选择我自己的Equals()方法,c#,.net,unit-testing,C#,.net,Unit Testing,我正在尝试为.NETFramework类库项目构建一个单元测试项目。我有一些定制的模型类型,它们实现了IEquatable接口,并且在要测试的项目中有自己的Equals()方法。 我在网上读了几篇文档,他们说Assert.AreEqual方法只在对象没有自己的Equals()方法时才运行RefereceEqual。但是我发现TestMethod仍然没有返回true,即使对象有自己的Equals方法。我用一个简单的例子重新创建了下面的场景。我做错什么了吗 namespace Demo {

我正在尝试为.NETFramework类库项目构建一个单元测试项目。我有一些定制的模型类型,它们实现了
IEquatable
接口,并且在要测试的项目中有自己的
Equals()
方法。 我在网上读了几篇文档,他们说
Assert.AreEqual
方法只在对象没有自己的
Equals()
方法时才运行
RefereceEqual
。但是我发现TestMethod仍然没有返回true,即使对象有自己的
Equals
方法。我用一个简单的例子重新创建了下面的场景。我做错什么了吗

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

dog1.Equals(dog2)
将返回true,而单元测试将失败。如何在测试方法中正确比较dog1和dog2。

在引擎盖下,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);
        }
    }

在后台,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);
        }
    }

这张便笺应该能回答您的问题。
Assert.AreEqual
正在使用另一个
Equals(object)
从基本对象尝试使用
Assert.IsTrue(dog1.Equals(dog2))
,下面是一个向@Nkosi感激先生学习的好例子!很好的参考此注释应该回答您的问题
Assert.AreEqual
正在使用来自基本对象的另一个
Equals(object)
尝试使用
Assert.IsTrue(dog1.Equals(dog2))
,下面是一个向@Nkosi感激先生学习的好例子!很好,我知道你在说什么…但一个小缺陷是…你的
其他
来自哪里…你刚刚传入了
obj
对吗?@Gen.L实际上,
other
是将
obj
转换为MyDog后的结果。谢谢你,先生~,
other
obj
转换为MyDog后的结果。谢谢您,先生~~~~~~~~~~~