Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# 比较单元测试中的两个列表_C#_Unit Testing_Collections - Fatal编程技术网

C# 比较单元测试中的两个列表

C# 比较单元测试中的两个列表,c#,unit-testing,collections,C#,Unit Testing,Collections,我有两个列表,其中包含两个用户对象 列表中的对象的值相同 但当我检查此列表时,单元测试返回CollectionAssert.AreEqual失败。(索引0处的元素不匹配) 我认为,CollectionAssert.AreEqual方法不会检查列表中的值,而是检查引用 我的问题是如何在单元测试中比较两个列表的值 公共类用户 { 公共字符串名称{get;set;} 公共字符串密码{get;set;} } [测试方法] 公共无效检查用户列表() { 列表用户=新列表() { 新用户(){Name=“N

我有两个列表,其中包含两个用户对象

列表中的对象的值相同

但当我检查此列表时,单元测试返回
CollectionAssert.AreEqual
失败。(索引0处的元素不匹配)

我认为,
CollectionAssert.AreEqual
方法不会检查列表中的值,而是检查引用

我的问题是如何在单元测试中比较两个列表的值

公共类用户
{
公共字符串名称{get;set;}
公共字符串密码{get;set;}
}
[测试方法]
公共无效检查用户列表()
{
列表用户=新列表()
{
新用户(){Name=“Name”,Password=“Pass”},
新用户(){Name=“Name1”,Password=“Pass1”},
新用户(){Name=“Name2”,Password=“Pass2”},
};
List users1=新列表()
{
新用户(){Name=“Name”,Password=“Pass”},
新用户(){Name=“Name1”,Password=“Pass1”},
新用户(){Name=“Name2”,Password=“Pass2”},
};
CollectionAssert.AreEqual(用户,用户1);
}

我认为您需要为
用户
类重写
=
运算符或
Equals()
方法

public class User
{
    public string Name { get; set; }
    public string Password { get; set; }

    public override bool Equals(object obj)
    {
        if (obj is User another)
        {
            return Name == another.Name && Password == another.Password;
        }

        return base.Equals(obj);
    }

    public static bool operator ==(User left, User right)
    {
        return left.Equals(right);
    }

    public static bool operator !=(User left, User right)
    {
        return !left.Equals(right);
    }

}

Equal和GetHashCode方法就足够了。然后CollectionAssert.AreEqual将按照您的预期工作

public class User 
{
    public string Name { get; set; }
    public string Password { get; set; }

    public override bool Equals(object obj)
    {
        var user = obj as User;
        return user != null &&
               Name == user.Name &&
               Password == user.Password;
    }

    public override int GetHashCode()
    {
        var hashCode = 1290039854;
        hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Name);
        hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Password);
        return hashCode;
    }
}
公共类用户
{
公共字符串名称{get;set;}
公共字符串密码{get;set;}
公共覆盖布尔等于(对象对象对象)
{
var user=obj作为用户;
返回用户!=null&&
Name==user.Name&&
Password==user.Password;
}
公共覆盖int GetHashCode()
{
var hashCode=1290039854;
hashCode=hashCode*-1521134295+EqualityComparer.Default.GetHashCode(名称);
hashCode=hashCode*-1521134295+EqualityComparer.Default.GetHashCode(密码);
返回哈希码;
}
}

#1覆盖
User.Equals()
#2
users.SequenceEquals(users1)
您需要覆盖类User中的Equals和GetHashCode,或者提供IComparer的实现以传递到CollectionAssert.Are的重载中。Thank fubo和Anthony Pegram的同样可能的副本覆盖Equals和GetHashCode就足够了。