C# Assert.AreEqual在比较两个IEnumerable对象时引发异常
目标方法的最小起订量输入列表为C# Assert.AreEqual在比较两个IEnumerable对象时引发异常,c#,unit-testing,nunit,C#,Unit Testing,Nunit,目标方法的最小起订量输入列表为 var moqReturn = new List<Text>() { new Text() {Id = 0, SenderId = 3, ReceiverId = 5}, new Text() {Id = 1, SenderId = 5, ReceiverId = 1}, new Text() {Id = 2, SenderId = 1, ReceiverId = 5}, new Text() {Id = 3, Send
var moqReturn = new List<Text>()
{
new Text() {Id = 0, SenderId = 3, ReceiverId = 5},
new Text() {Id = 1, SenderId = 5, ReceiverId = 1},
new Text() {Id = 2, SenderId = 1, ReceiverId = 5},
new Text() {Id = 3, SenderId = 3, ReceiverId = 5},
new Text() {Id = 4, SenderId = 3, ReceiverId = 5},
new Text() {Id = 5, SenderId = 5, ReceiverId = 4},
new Text() {Id = 6, SenderId = 5, ReceiverId = 4},
new Text() {Id = 7, SenderId = 5, ReceiverId = 10}
};
问题是Assert方法显示消息测试失败
<System.Collections.Generic.List`1[Text]> with 3 elements, actual is <System.Linq.Enumerable+<TakeIterator>d__24`1[Text]>
Values differ at index [0]
Expected: <Text>
But was: <Text>
有3个元素,实际值为
值在索引[0]处不同
预期:
但是:
我调试了目标方法,它返回了预期的结果,但NUnit Assert说它们不一样
我做错了什么?
Assert.AreEqual
将比较两个不同列表的引用
用于比较集合
然后,您将需要对
文本的引用进行比较
或提供一个IComparer断言。AreEqual
将比较两个不同列表的引用
用于比较集合
然后,您将需要使用
文本
或提供一个IComparer正如一些评论和Ofir的回答所示,您必须覆盖文本
的Equals方法,这是正确的。否则,将使用object.Equals
您必须使用CollectionAssert.AreEqual
是不正确的,它与Assert.AreEqual
或Assert.that(…),即.EqualTo(…)
没有区别CollectionAssert
除了使MsTest用户更容易转换为NUnit之外,没有其他用途
两个集合的类型必须相等也是不正确的。NUnit根据数组、集合、列表和枚举的内容对其进行比较。正如一些评论和Ofir的回答所示,您必须覆盖
Text
的Equals方法,这是正确的。否则,将使用object.Equals
您必须使用CollectionAssert.AreEqual
是不正确的,它与Assert.AreEqual
或Assert.that(…),即.EqualTo(…)
没有区别CollectionAssert
除了使MsTest用户更容易转换为NUnit之外,没有其他用途
两个集合的类型必须相等也是不正确的。NUnit会根据数组、集合、列表和枚举的内容进行比较。可能是因为
Text
是一个类,并且您没有重写Equals
,这意味着相等性测试是引用相等性。我相信它会失败,因为类型不同。一个是IEnumerable,另一个是List。Assert.AreEqual还比较对象类型,这就是它失败的原因。您希望CollectionAssert.AreEqual
假设您已经为文本
实现了相等。可能是因为文本
是一个类,并且您没有覆盖Equals
,这意味着相等测试是引用相等。我认为它失败是因为类型不同。一个是IEnumerable,另一个是List。Assert.AreEqual还比较对象类型,这就是它失败的原因。您希望CollectionAssert.AreEqual
假设您已为Text
实现相等。
var expectedOutPut = new List<Text>()
{
new Text() {Id = 7, SenderId = 5, ReceiverId = 10},
new Text() {Id = 6, SenderId = 5, ReceiverId = 4},
new Text() {Id = 5, SenderId = 5, ReceiverId = 4}
};
var result = objectForTarget.GetRecentTexts(5, 3, 0);
Assert.AreEqual(expectedOutPut, result);
<System.Collections.Generic.List`1[Text]> with 3 elements, actual is <System.Linq.Enumerable+<TakeIterator>d__24`1[Text]>
Values differ at index [0]
Expected: <Text>
But was: <Text>