2015-09-24 2 views
8

Я заметил некоторое нечетное поведение в модульном тесте для C#.Различные результаты от новых DateTime() и DateTime.Parse

Учитывая следующий код:

var dateTime = DateTime.Parse("01/01/2015"); 
Assert.AreEqual(dateTime, new DateTime(2015, 1, 1)); 

я неудавшийся тест с результатом:

Expected: 2015-01-01 00:00:00.000 
But was: 01/01/2015 00:00:00 +00:00 

Я пытался дозвониться ToString() на оба, переходя в CultureInfo.CurrentCulture и установке DateKind на новый вызов DateTime для локального и UTC, но я получаю одинаковые результаты.

Почему эти два метода не дают одинаковый результат?

+0

[используя '==' результат, это правда] (http://csharppad.com/gist/ba4918946a41c49b9c4c). должно быть то, что вы не показываете. – Amit

+0

Что такое 'CurrentCulture'? –

+1

Какова ваша структура тестирования, и какова подпись 'Assert.AreEqual' - она ​​принимает' Object', 'DateTime',' String' или что-то еще? –

ответ

1

Я бы дал выстрел с:

Assert.IsTrue(DateTime.Compare(DateTime.Parse("01/01/2015"), new DateTime(2015, 1, 1) == 0); 
+0

Хотя это может обойти проблему, на самом деле это не отвечает на вопрос: «Почему эти два метода не дают одинаковый результат?» _ –

+0

Поскольку он использует AreEquals в datetime, может не использовать правильный компаратор, но , поскольку я не уверен в этом, я бы предпочел получить обратную связь от OP, чтобы объяснить больше –

0

Вы никогда не должны когда-либо жёстко даты как строки. Какой смысл делать это?

DateTime.Parse("01/01/2015") 

вместо этого:

new DateTime(2015,1,1) 

DateTime.Parse использует текущую культуру по умолчанию для создания даты. Рассмотрим следующий пример:

DateTime.Parse("09/06/2015"); 

Это 9 июня или 6 сентября? В зависимости от вашей культуры машины вы получите разные результаты. Если строка DateTime происходит откуда-то, вы можете заставить метод Parse использовать определенный формат/культуру.

Возвращаясь к вопросу, возможно, это зависит от культуры.

+4

_ «В чем смысл этого делать?» _ Возможно, модульный тест имитирует ввод пользователя в текстовое поле? –

+0

Прочитать следующее предложение – MistyK

+0

@JamesThorpe - bang on. На самом деле, он вытягивает значения из таблицы базы данных, но для модульного теста я имитирую этот бит, потому что модульные тесты. –

0

Вопрос предполагает в упрощенном примере, что первая переменная является DateTime, когда она фактически является DateTimeOffset. Публичные методы, которые сгенерировали эту переменную, изменились, и я предположил, что возвращаемый тип все еще был DateTime.

Так что причина, по которой они дают разные результаты, состоит в том, что они разные!

Урок первый: проверьте типы, даже если вы знаете, что они собой представляют. Урок 2. Не упрощайте слишком много в примерах SO-вопросов.

Смежные вопросы