为什么这个断言失败了

时间:2013-08-02 19:52:40

标签: c# .net

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

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);

它失败了。为什么呢?

2 个答案:

答案 0 :(得分:4)

如果ReservationSearchParametersclass而不是struct,则通过引用比较其实例。 这就是你弄错的原因,因为有两个不同的对象有两个不同的指针,并且它们的属性具有相同的数据无关紧要。

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

答案 1 :(得分:2)

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

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

为了使断言通过,你需要定义使这两个对象相等的原因。

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

  1. 定义==!=运算符。
  2. 覆盖bool Equals(object other){}(如果您这样做,建议您也int GetHashCode()
  3. 实施IEquatable<ReservationSearchParameters>
  4. 一旦你告诉它如何比较两个不同的对象,你的断言应该通过。