Rails TimeHelpers travel_to с наносекундой не работает

#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