47

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

4

8 に答える 8

44

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

連続して 2 回実行DateTime.Now()すると、分単位までは同じ数に見え、おそらく秒単位まで同じ数になるように見えますが、多くの場合、目盛りごとに異なります。等しいかどうかを分だけ確認したい場合は、それぞれの DateTime をその分だけ比較します。DateTime の丸めについては、こちらを参照してください。


解像度に関する注意:

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

于 2010-04-28T18:38:39.400 に答える
4

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

于 2010-04-28T18:47:43.997 に答える
3

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

于 2010-04-28T18:42:13.610 に答える
2

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

于 2016-06-08T17:26:56.543 に答える
1

logoutTime と log.First().Timestamp の両方が DateTime として入力されていますか?

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

于 2010-04-28T18:39:10.537 に答える
0

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

Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks);
于 2010-04-28T18:42:27.373 に答える
-1

オブジェクトの等価性を判断するためにAssert.AreEqual<T>使用すると思いますが、値は判断しません。Object.Equals()

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

于 2010-04-28T18:42:24.150 に答える