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