为什么这个断言失败了
本文关键字:失败 断言 为什么 | 更新日期: 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);
它失败了。为什么?
如果ReservationSearchParameters
是class
而不是struct
,则通过引用比较其实例。这就是为什么你会得到false,因为有两个不同的对象有两个指向它们的不同指针,它们的属性有相同的数据并不重要。
您应该为每个属性编写一个单独的断言。
您正在尝试比较两个不相关的对象,它们恰好具有相同的值。
类的默认相等性检查将是引用相等性,由于这是两个不同的对象,引用相等性将失败。
为了使断言通过,您需要定义是什么使这两个对象相等。
根据Assert.AreEqual
的编写方式,您可能可以执行以下任何操作:
- 定义
==
和!=
运算符 - 覆盖
bool Equals(object other){}
(如果执行此操作,建议也执行int GetHashCode()
- 执行
IEquatable<ReservationSearchParameters>
一旦你告诉它如何比较两个不同的对象,你的断言就会通过。