这开始是因为我试图通过以下方式对一段代码进行单元测试:
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);
它失败了。为什么呢?
答案 0 :(得分:4)
如果ReservationSearchParameters
为class
而不是struct
,则通过引用比较其实例。
这就是你弄错的原因,因为有两个不同的对象有两个不同的指针,并且它们的属性具有相同的数据无关紧要。
你应该为每个属性写一个单独的断言。
答案 1 :(得分:2)
您正在尝试比较恰好具有相同值的两个不相关的对象。
类的默认等式检查将是引用相等,因为这是两个不同的对象,引用相等性将失败。
为了使断言通过,你需要定义使这两个对象相等的原因。
根据Assert.AreEqual
的编写方式,您可以执行以下任何操作:
==
和!=
运算符。bool Equals(object other){}
(如果您这样做,建议您也int GetHashCode()
。IEquatable<ReservationSearchParameters>
。一旦你告诉它如何比较两个不同的对象,你的断言应该通过。