【问题标题】:How can I compare two lists with xunit test如何将两个列表与 xunit 测试进行比较
【发布时间】:2019-12-23 16:01:13
【问题描述】:

我目前正在尝试使用 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对象

标签: c# list unit-testing xunit


【解决方案1】:

这与对象相等有关。

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

正如 Jonathon Chase 在 cmets 中提到的那样。

override GetHashCode() 方法也是一个好主意。最好从IEquatable&lt;T&gt; 继承,这样可以避免强制转换。

一切都变绿了。

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

【讨论】:

  • 非常感谢!我的问题是使用默认的 Equal 方法。我现在刚刚覆盖了它,还添加了 && this.type == ((myObject)obj).type && this.modifier == ((myObject)obj).modifier 并且效果很好。
  • 在覆盖类型的 Equals 方法时,还必须覆盖 GetHashCode。在进行相等时,您还应该检查类型对称性。继续执行IEquatable&lt;T&gt; 也是一个好主意。
  • @JonathonChase 我不熟悉您所指的内容。为什么? -> 你还必须覆盖GetHashCode
  • @panoskarajohn Refer to this post
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多