Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用xunit测试比较两个列表_C#_List_Unit Testing_Xunit - Fatal编程技术网

C# 如何使用xunit测试比较两个列表

C# 如何使用xunit测试比较两个列表,c#,list,unit-testing,xunit,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

我目前正在尝试比较两个列表,其中的项目相同,但运行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" }]

“Assert.Equal()失败”
应为:列表[myObject{modifier='+',name=“name”,type=“string”},myObject{modifier='+',name=“age”,type=“int”}]
实际值:List[myObject{modifier='+',name=“name”,type=“string”},myObject{modifier='+',name=“age”,type=“int”}]

这与对象相等有关

MyObject
未实现
Equals方法
。默认情况下,您将获得一个引用等式。我假设您有两个不同的对象用于
MyObject

这意味着列表中包含相似的对象(表示具有相同的值)并不重要,因为它们不属于相同的引用,所以测试会检查这一点,这就是它失败的原因

正如乔纳森·蔡斯在评论中提到的那样

重写
GetHashCode()
方法也是一个好主意。最好继承自
IEquatable
,这样可以避免强制转换

一切都变绿了

        [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
        }
[事实]
public void ListMyObject()
{
var list1=新列表
{
新的MyObject{Name=“H”}
};
var list2=新列表
{
新的MyObject{Name=“H”}
};
Assert.Equal(list1,list2);//传递
}

您是否收到运行时错误或断言失败?当我运行单元测试时,我收到断言失败消息。它不知道如何比较两个
myObject
对象非常感谢!我的问题是,使用默认的相等方法。我现在刚刚重写了它,还添加了&&this.type==((myObject)obj)。type&&this.modifier==((myObject)obj)。修饰符,它工作得很好。在重写类型的
Equals
方法时,还必须重写
GetHashCode
。在执行相等操作时,还应检查类型对称性。同时,继续实施
IEquatable
也是一个好主意。@JonathonChase我不熟悉您所指的内容。为什么?->您还必须覆盖
GetHashCode
@panoskarajohn
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
        }