#ruby-on-rails #ruby #rspec #ruby-on-rails-5 #rspec-rails
#ruby-on-rails #ruby #rspec #ruby-on-rails-5 #rspec-rails
Вопрос:
В моем коде у меня есть Time.current.strftime('%Y%m%d%H%M%S%6N')
и для проверки этого я использовал метод Rails TimeHelpers #travel_to.
в тестах:
travel_to Time.local(2015, 2, 2, 11, 14, 30.123456) do
...
end
Проблема в том, что Time.current.strftime('%Y%m%d%H%M%S%6N')
возвращает 000000 за наносекунды, когда оно должно быть 123456.
Есть ли обходной путь? На данный момент я стараюсь не использовать драгоценный камень TimeCop.
Комментарии:
1. Это ожидаемо. Из документации для
travel_to
: «Обратите внимание, что usec за прошедшее время будет установлен в 0»2. Спасибо @Stefan, вы можете ответить на этот пост, и я отмечу ваш ответ. Это позор, потому что это означает, что мне придется использовать timecop
Ответ №1:
К сожалению, Rails’ travel_to
усекает значение до секунд. Из документов:
Обратите внимание, что usec за прошедшее время будет установлен в 0, чтобы предотвратить ошибки округления с помощью внешних служб, таких как MySQL (которые будут округлять вместо floor, что приведет к ошибкам с отклонением на одну секунду).
В качестве обходного пути вы можете изменить свой код, чтобы принять явное время с текущим временем по умолчанию:
def your_method(time = Time.current)
time.strftime('%Y%m%d%H%M%S%6N')
end
И в ваших тестах:
describe '#your_method' do
context 'with an explicit time value' do
let(:time) { Time.local(2015, 2, 2, 11, 14, 30.123456) }
it 'generates the corresponding timestamp' do
expect(your_method(time)).to eq('20150202111430123456')
end
end
context 'without argument' do
around do |example|
travel_to(Time.local(2015, 2, 2, 11, 14)) { example.run }
end
it 'generates the current timestamp' do
expect(your_method).to eq('20150202111400000000')
end
end
end