c# - NUnit 的 CollectionAssert 为类似的自定义类列表返回 false

标签 c# nunit assert equality

这是我的类(class):

public class MyClass
{
    public string Name { get; set; }
    public string FaminlyName { get; set; }
    public int Phone { get; set; }
}

然后我有两个相似的列表:

List<MyClass> list1 = new List<MyClass>()
{
    new MyClass() {FaminlyName = "Smith", Name = "Arya", Phone = 0123},
    new MyClass() {FaminlyName = "Jahani", Name = "Shad", Phone = 0123}
};
List<MyClass> list2 = new List<MyClass>()
{
    new MyClass() {FaminlyName = "Smith", Name = "Arya", Phone = 0123},
    new MyClass() {FaminlyName = "Jahani", Name = "Shad", Phone = 0123}
};

问题是 NUnit CollectionAssert 总是返回 false。

CollectionAssert.AreEqual(list1,list2);

我是否遗漏了有关 CollectionAssert 测试的内容

最佳答案

AreEqual 检查对象是否相等。由于您没有覆盖 Equals 方法,如果 references 不相等,它将返回 false

您可以通过覆盖 MyClassEquals 方法来解决此问题:

public class MyClass {
    public string Name { get; set; }
    public string FaminlyName { get; set; }
    public int Phone { get; set; }

    public override bool Equals (object obj) {
         MyClass mobj = obj as MyClass;
         return mobj != null && Object.Equals(this.Name,mobj.Name) && Object.Equals(this.FaminlyName,mobj.FaminlyName) && Object.Equals(this.Phone,mobj.Phone);
    }

}

此外,您最好也覆盖 GetHashCode 方法:

public class MyClass {
    public string Name { get; set; }
    public string FaminlyName { get; set; }
    public int Phone { get; set; }

    public override bool Equals (object obj) {
         MyClass mobj = obj as MyClass;
         return mobj != null && Object.Equals(this.Name,mobj.Name) && Object.Equals(this.FaminlyName,mobj.FaminlyName) && Object.Equals(this.Phone,mobj.Phone);
    }

    public override int GetHashCode () {
        int hc = 0x00;
        hc ^= (this.Name != null) ? this.Name.GetHashCode() : 0;
        hc ^= (this.FaminlyName != null) ? this.FaminlyName.GetHashCode() : 0;
        hc ^= this.Phone.GetHashCode();
        return hc;
    }

}

关于c# - NUnit 的 CollectionAssert 为类似的自定义类列表返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34382277/

相关文章:

c# - 从 C# WinForm 将数据发布到 PHP 页面

c# - 如何对使用线程的方法进行单元测试?

c# - SQLDataReader 和 CommandBehaviour.CloseConnection

c# - 在 Jetbrains Rider 中使用 SpecFlow

linux - 从Visual Studio在Linux docker容器中调试nunit测试

nunit - CCnet + NAnt 超时

python:使用断言引发不同的错误类型

c++ - C++ 构建器 XE4 上的 AssertErrorProc

java - 为什么在 Assert.assertNotNull 中调用 void 函数是有效的?

c# - IDisposable:是否有必要在 finally {} 上检查 null?