为什么测试DateTime相等时此单元测试失败?

时间:2008-12-12 20:32:52

标签: unit-testing datetime .net-3.5 nunit

在.NET 3.5上使用NUnit 2.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));
    }
}

5 个答案:

答案 0 :(得分:14)

日期不相等。 TryParse会丢掉一些滴答声。比较Tick值。

一次试运行:

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

收率:

633646934930000000
633646934936763185

答案 1 :(得分:3)

问题不在于TryParse,实际上是ToString()。

DateTime对象以精确度(如果不是准确度)开始,下降到百万分之一秒。 ToString()将其转换为字符串,精度仅为一秒。

TryParse正在尽其所能地发挥作用。

如果添加格式说明符(沿"yyyy-MM-dd HH:mm:ss.ffffff"行),它应该有用。

答案 2 :(得分: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?();
        }
    }

答案 3 :(得分:0)

我不知道这在.NET中是否相同,但在Java中,equals通常只会在实例相同时进行比较,而不是在值相同的情况下进行比较。你想要使用compareTo。

答案 4 :(得分:0)


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