为什么这个断言失败了

本文关键字:失败 断言 为什么 | 更新日期: 2023-09-27 18:26:14

这是因为我试图以以下方式对一段代码进行单元测试:

ReservationSearchParameters expectedSearchParams = new ReservationSearchParameters(),  sentSearchParameters = new ReservationSearchParameters();
List<Reservation> simpleReservationList = new List<Reservation>();
simpleReservationList.Add(........... I added data ..........)
expectedSearchParams.LocationIDs = "2";
_reservationDataLayerMock.Setup(x => x.LoadReservationsByOptionalParameters(expectedSearchParams)).Returns(simpleReservationList);
sentSearchParameters.LocationIDs = "2";
Assert.AreNotEqual(null, _reservationBL.GetReservationsByOptionalParameters(sentSearchParameters).Count);

我的测试失败了,它没有返回我试图返回的内容,尽管我的SearchParameters数据集对我来说是准确的。

所以我尝试了这个:

Assert.AreEqual(expectedSearchParams, sentSearchParameters);

它失败了。为什么?

为什么这个断言失败了

如果ReservationSearchParametersclass而不是struct,则通过引用比较其实例。这就是为什么你会得到false,因为有两个不同的对象有两个指向它们的不同指针,它们的属性有相同的数据并不重要。

您应该为每个属性编写一个单独的断言。

您正在尝试比较两个不相关的对象,它们恰好具有相同的值。

类的默认相等性检查将是引用相等性,由于这是两个不同的对象,引用相等性将失败。

为了使断言通过,您需要定义是什么使这两个对象相等。

根据Assert.AreEqual的编写方式,您可能可以执行以下任何操作:

  1. 定义==!=运算符
  2. 覆盖bool Equals(object other){}(如果执行此操作,建议也执行int GetHashCode()
  3. 执行IEquatable<ReservationSearchParameters>

一旦你告诉它如何比较两个不同的对象,你的断言就会通过。