8

.NET3.5でNUnit2.2を使用すると、DateTime.Equalsを使用すると次のテストが失敗します。なんで?

[TestFixture]
public class AttributeValueModelTest
{
    public class HasDate
    {
        public DateTime? DateValue
        {
            get
            {
                DateTime value;
                return DateTime.TryParse(ObjectValue.ToString(), out value) ? value : new DateTime?();
            }
        }

        public object ObjectValue { get; set; }
    }

    [Test]
    public void TwoDates()
    {
        DateTime actual = DateTime.Now;
        var date = new HasDate {ObjectValue = actual};
        Assert.IsTrue(date.DateValue.Value.Equals(actual));
    }
}
4

5 に答える 5

16

日付は同じではありません。TryParseはいくつかのティックを落とします。ティック値を比較します。

1回のテスト実行の場合:

Console.WriteLine(date.DateValue.Value.Ticks);
Console.WriteLine(actual.Ticks);

収量:

633646934930000000
633646934936763185
于 2008-12-12T20:43:57.623 に答える
3

問題は実際には TryParse ではなく、ToString() にあります。

DateTime オブジェクトは、100 万分の 1 秒までの精度 (正確ではないにしても) で開始されます。ToString() は、1 秒単位の精度で文字列に変換します。

TryParse は与えられたもので最善を尽くしています。

フォーマット指定子を (の行に沿って) 追加すると"yyyy-MM-dd HH:mm:ss.ffffff"、機能するはずです。

于 2008-12-12T21:16:00.147 に答える
1

すべての精度を含むフォーマットを指定するには、String.Format()メソッドを使用できます。ジェームズが与える例は次のようになります。

String.Format("{0:yyyy-MM-dd HH:mm:ss.ffffff}", ObjectValue);

日付ではないものを渡すとどうなるかわかりません。

おそらく、より簡単なアプローチは、すでに日付オブジェクトを持っている場合に特別なケースを追加することです。

    public DateTime? DateValue
    {
        get
        {
            DateTime value = ObjectValue as DateTime;
            if (value != null) return value;
            return DateTime.TryParse(ObjectValue.ToString(), out value) ? value : new DateTime?();
        }
    }
于 2008-12-12T22:36:18.490 に答える
0

これが.NETで同じかどうかはわかりませんが、Javaでは、値が同じである場合ではなく、インスタンスが同じである場合にのみ、equalsが比較されることがよくあります。代わりに、compareToを使用することをお勧めします。

于 2008-12-12T20:34:48.407 に答える
0

public DateTime? DateValue
        {
            get
            {
                DateTime value;
                bool isDate = DateTime.TryParse(ObjectValue.ToString(), out value); 
                return isDate ? new DateTime?(value) : new DateTime?();
            }
        }

于 2008-12-12T20:37:49.350 に答える