Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/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# Assert.AreEqual在比较两个IEnumerable对象时引发异常_C#_Unit Testing_Nunit - Fatal编程技术网

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>