【问题标题】:Compare two List which in Unit test比较单元测试中的两个列表
【发布时间】:2026-01-05 02:40:01
【问题描述】:

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

列表中的对象的值相同。

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

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

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

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

[TestMethod]
public void CheckUserList()
{
    List<User> users = new List<User>()
    {
        new User(){ Name="Name", Password="Pass" },
        new User(){ Name="Name1", Password="Pass1" },
        new User(){ Name="Name2", Password="Pass2" },
    };

    List<User> users1 = new List<User>()
    {
        new User(){ Name="Name", Password="Pass" },
        new User(){ Name="Name1", Password="Pass1" },
        new User(){ Name="Name2", Password="Pass2" },
    };

    CollectionAssert.AreEqual(users, users1);
}

【问题讨论】:

  • #1 覆盖User.Equals() #2 users.SequenceEquals(users1)
  • 您需要覆盖 User 类中的 Equals 和 GetHashCode,或者提供 IComparer 的实现以传递给 CollectionAssert.AreEqual 的重载
  • 感谢 fubo 和 Anthony Pegram 覆盖 Equals 和 GetHashCode 就足够了。

标签: c# unit-testing collections


【解决方案1】:

我认为您需要为您的 User 类覆盖 == 运算符或 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);
    }

}

【讨论】:

    【解决方案2】:

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

    【讨论】: