我如何比较两个列表与 xunit 测试

How can I compare two lists with xunit test

我目前正在尝试使用 xUnit 比较两个列表,其中包含相同的项目,但在 运行.

时出现错误
Assert.Equal(expectedList, actualList);

错误:

"Assert.Equal() Failure"
Expected: List<myObject> [myObject { modifier = '+', name = "name", type = "string" }, myObject { modifier = '+', name = "age", type = "int" }]
Actual:   List<myObject> [myObject { modifier = '+', name = "name", type = "string" }, myObject { modifier = '+', name = "age", type = "int" }]

这与对象相等性有关。

MyObject 没有实现 Equals method。默认情况下你会得到一个引用相等性。我假设 MyObject.

有两个不同的对象

意思是你的 List 包含相似的对象(意思是具有相同的值)并不重要,它们不相同 reference,所以你的测试会检查这一点,这就是为什么它失败

internal class MyObject
{
    {
        public char Modifier { get; set; }
        public string Name { get; set; }
        public string Type { get; set; }

    }
}


            [Fact]
            public void ListMyObject()
            {
                var list1 = new List<MyObject>
                {
                    new MyObject{ }
                };
                var list2 = new List<MyObject>
                {
                    new MyObject{ }
                };

                Assert.Equal(list1, list2); // Fails
            }

当我们将 class 更新为此时。

internal class MyObject
    {
        public char Modifier { get; set; }
        public string Name { get; set; }
        public string Type { get; set; }
        //When i add this to my class.
        public override bool Equals(object obj)
        {
            return this.Name == ((MyObject)obj).Name;
        }
    }

也如 Jonathon Chase 的评论中所述。

override GetHashCode() 方法也是一个好主意。最好从 IEquatable<T> 继承,这样你就可以避免转换。

一切都变绿了。

        [Fact]
        public void ListMyObject()
        {
            var list1 = new List<MyObject>
            {
                new MyObject{ Name = "H" }
            };
            var list2 = new List<MyObject>
            {
                new MyObject{ Name = "H" }
            };

            Assert.Equal(list1, list2); //Passes
        }