Проблемы со спецификацией, которая работает со временем - PullRequest
2 голосов
/ 17 января 2012

В моей спецификации мне нужно проверить, правильно ли строки конвертируются в другие типы. Среди них Time, Date и DateTime.

Тесты отлично работают со всеми типами, включая Date, но не проходят, если задействовано Time:

let(:type) { DateTime }
let(:date_time) { type.now }
let(:params) { [ date_time.to_s ] }

it 'should convert the parameters to dates/times' do
  # converted basically calls params.map { |param| type.parse param }
  converted.should == [date_time]
end

Это на самом деле почти работает:

expected: [#<DateTime: 2012-01-17T15:03:27-02:00 ((2455944j,61407s,568873440n),-7200s,2299161j)>]
     got: [#<DateTime: 2012-01-17T15:03:27-02:00 ((2455944j,61407s,0n),-7200s,2299161j)>] (using ==)

Разница отключена только одним значением, но я не знаю, что именно это означает. Результат теста Time еще более запутанный:

expected: [2012-01-17 15:03:27 -0200]
     got: [2012-01-17 15:03:27 -0200] (using ==)

Единственными различиями между тестами являются тип и описание. После некоторой трассировки мне кажется, что проанализированные времена не имеют микросекундной точности; usec всегда возвращает 0.

Какие-нибудь советы о том, как заставить эти спецификации пройти?

Ответы [ 2 ]

3 голосов
/ 17 января 2012

Попробуйте сравнить их строковые представления, используя форматирование , исключающее поля, которые вы не хотите сравнивать (например, миллис, микро и т. Д.).

converted[0].iso8601(0).should == date_time.iso8601(0)

[Edit] Обратите внимание, что в приведенном выше примере сравниваются два DateTimes без каких-либо дробных секунд (см. Связанные iso8601 документы выше).

Если вы действительно хотите сравнить сами объекты DateTime, тогда ваш тестовый кодВ завершение вам нужно будет просто исправить реализацию, чтобы часть дробных секунд скорректировалась на некоторое фиксированное значение (например, ноль).

0 голосов
/ 17 января 2012

Изменена реализация, чтобы использовать менее точную версию текущего времени:

  let(:type) { DateTime }
- let(:date_time) { type.now }
+ let(:date_time) { type.parse type.now.to_s }
...