Почему этот модульный тест не проходит при тестировании равенства DateTime? - PullRequest
6 голосов
/ 12 декабря 2008

При использовании NUnit 2.2 в .NET 3.5 следующий тест не пройден при использовании 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 ]

14 голосов
/ 12 декабря 2008

Даты не совпадают. TryParse сбрасывает некоторые галочки. Сравните значения тиков.

Для одного пробного запуска:

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

Урожайность:

633646934930000000
633646934936763185
3 голосов
/ 13 декабря 2008

Проблема не в TryParse, а в самом ToString ().

Объект DateTime начинается с точности (если не точности) вплоть до миллионной доли секунды. ToString () конвертирует в строку с точностью до секунды.

TryParse делает все возможное с тем, что ему дают.

Если вы добавите спецификатор формата (вдоль строк "yyyy-MM-dd HH:mm:ss.ffffff"), он должен работать.

1 голос
/ 13 декабря 2008

Чтобы указать формат, который включает в себя всю точность, вы можете использовать метод 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?();
        }
    }
0 голосов
/ 12 декабря 2008

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

0 голосов
/ 12 декабря 2008

Я не знаю, совпадает ли это в .NET, но в Java равенства часто сравниваются, только если экземпляры одинаковы, а не совпадают значения. Вместо этого вы хотели бы использовать CompareTo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...