web-dev-qa-db-ja.com

なぜ日時が比較できないのですか?

私の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());

42
5YrsLaterDBA

ティック/ミリ秒の数が等しいことを確認しましたか?

DateTime.Now()を2回続けて実行すると、分まで同じ数値であるように見え、おそらくsecond、しかしそれらはしばしばダニによって異なります。分とのみ等しいかどうかをチェックする場合は、各DateTimeをその程度だけ比較します。日時の丸めについては、 ここ を参照してください。


解像度に関する注意

Nowプロパティは、パフォーマンスの測定によく使用されます。ただし、解像度が低いため、ベンチマークツールとしての使用には適していません。より良い代替手段は Stopwatch クラスを使用することです。

43
Dinah

Assert failメソッドはおそらくDateTimeで ToString() を呼び出しており、ミリ秒コンポーネントのない、切り捨てられた人間が読める形式の日付を返します。これが、実際には、DateTimeオブジェクトの精度が100ナノ秒単位( Tick として知られている)である場合に等しいと思われる理由です。つまり、2つのDateTimeオブジェクトがまったく同じ値を持つことはほとんどありません。比較するために、おそらく日付を必要な忠実度にフォーマットすることによって、おそらく値を切り捨てる必要があります。

3
Dan Diplo

Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks)のようなものを試してください

2
Germ

エンティティフレームワークを使用すると、.AsNoTracking()を使用してデータベースからフェッチする場合、DateTimeプロパティはわずかに丸められますが、.AsNoTracking()がない場合は必ずしも丸められません元の値はまだメモリにあります。したがって、データベースへのラウンドトリップを伴う統合テストでは、データベースによって精度がわずかに低下するため、.ToString()を使用するのが最善だと思います。

1
Matthew

LogoutTimeとlog.First()。Timestampの両方がDateTimeとして入力されていることを確認しますか?

その場合、より具体的な時間情報(ミリ秒など)の値も異なる可能性があります。

1
reustmd

_Assert.AreEqual<T>_はObject.Equals()を使用してオブジェクトの等価性を判別しますが値は判別しないと思います。

おそらく、このステートメントは2つの異なるオブジェクトを比較しているため、falseを返します。

0
Asad Butt

LogoutTimeとlog.First()。Timestampが両方ともDateTime型であると仮定すると、代わりにこれを使用してみてください:

Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks);
0
John Lechowicz