我如何比较两个列表与 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
}
我目前正在尝试使用 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
}