如何使用XUnit测试比较两个列表

时间:2019-12-23 16:01:13

标签: c# list unit-testing xunit

我目前正在尝试将两个具有相同项目的列表与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" }]

1 个答案:

答案 0 :(得分:4)

这与对象相等有关。     MyObject未实现Equals method。默认情况下,您获得引用相等性。我假设您为MyObject有两个不同的对象。

这意味着您的列表拥有相似的对象(意味着具有相同的值)并不相同,它们并不具有相同的引用,因此您的测试会对此进行检查,这就是失败的原因

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
            }

当我们将班级更新为此时。

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

一切都变成绿色。

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