C# 如何使用xunit测试比较两个列表
我目前正在尝试比较两个列表,其中的项目相同,但运行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
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
}