私のC#ユニットテストには次のステートメントがあります。
_Assert.AreEqual(logoutTime, log.First().Timestamp);
_
次の情報で失敗する理由:
_Assert.AreEqual failed. Expected:<4/28/2010 2:30:37 PM>. Actual:<4/28/2010 2:30:37 PM>.
_
彼らは同じではありませんか?
更新:
あなたが2番目に気にする場合はこれを使用してください:
Assert.AreEqual(logoutTime.ToString(), log.First().Timestamp.ToString());
Assert failメソッドはおそらくDateTimeで ToString() を呼び出しており、ミリ秒コンポーネントのない、切り捨てられた人間が読める形式の日付を返します。これが、実際には、DateTimeオブジェクトの精度が100ナノ秒単位( Tick として知られている)である場合に等しいと思われる理由です。つまり、2つのDateTimeオブジェクトがまったく同じ値を持つことはほとんどありません。比較するために、おそらく日付を必要な忠実度にフォーマットすることによって、おそらく値を切り捨てる必要があります。
Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks)
のようなものを試してください
エンティティフレームワークを使用すると、.AsNoTracking()
を使用してデータベースからフェッチする場合、DateTime
プロパティはわずかに丸められますが、.AsNoTracking()
がない場合は必ずしも丸められません元の値はまだメモリにあります。したがって、データベースへのラウンドトリップを伴う統合テストでは、データベースによって精度がわずかに低下するため、.ToString()
を使用するのが最善だと思います。
LogoutTimeとlog.First()。Timestampの両方がDateTimeとして入力されていることを確認しますか?
その場合、より具体的な時間情報(ミリ秒など)の値も異なる可能性があります。
_Assert.AreEqual<T>
_はObject.Equals()
を使用してオブジェクトの等価性を判別しますが値は判別しないと思います。
おそらく、このステートメントは2つの異なるオブジェクトを比較しているため、falseを返します。
LogoutTimeとlog.First()。Timestampが両方ともDateTime型であると仮定すると、代わりにこれを使用してみてください:
Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks);