-2

これは、次の方法でコードの一部を単体テストしようとしていたために始まりました。

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

そして、それは失敗しました。なんで?

4

2 に答える 2

4

ReservationSearchParametersが a でclassない場合、structそのインスタンスは参照によって比較されます。2 つの異なるポインタを持つ 2 つの異なるオブジェクトがあり、それらのプロパティが同じデータを持っているかどうかは問題ではないため、false になるのはそのためです。

プロパティごとに個別の assert を記述する必要があります。

于 2013-08-02T19:56:20.490 に答える
2

たまたま同じ値を持つ、関連のない 2 つのオブジェクトを比較しようとしています。

クラスのデフォルトの等価性チェックは参照の等価性になります。これらは 2 つの異なるオブジェクトであるため、参照の等価性は失敗します。

アサーションをパスさせるには、これら 2 つのオブジェクトを等しくするものを定義する必要があります。

の記述方法に応じてAssert.AreEqual、おそらく次のいずれかを実行できます。

  1. ==and!=演算子を定義します。
  2. オーバーライドbool Equals(object other){}します (これを行う場合は、 も行うことをお勧めしますint GetHashCode()
  3. 実装しIEquatable<ReservationSearchParameters>ます。

2 つの異なるオブジェクトを比較する方法を指定したら、アサーションは成功するはずです。

于 2013-08-02T19:58:11.020 に答える