Проблема с Rspec для отметки времени в хешах - PullRequest
0 голосов
/ 28 ноября 2018

Для сравнения с хеш-данными мы имели это в нашей спецификации

it 'should return the rec_1 in page format' do
     expect(response_body_json).to eql(Preseneter.new(ActiveRecordObject).page)
end

Presenter - это класс, который принимает ActiveRecordObject и отвечает хеш-данными в определенном формате.

Затем мы добавили updated_at с меткой времени в hash_data. В моем коде у меня есть updated_at = Time.zone.now Так что спецификация начала давать сбой, потому что оба updated_at имели разницу в несколько секунд.

Пробная заглушка Time.zone

it 'should return the rec_1 in page format' do
     allow(Time.zone).to receive(:now).and_return('hello')
     expect(response_body_json).to eql(Preseneter.new(ActiveRecordObject).page)
end

но теперь response_body_json.updated_at отображается как 'привет', но все же правая сторона имеет метку времени

Где я иду не так ???или есть какой-то другой лучший способ справиться с такими сценариями?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018
before do
  movie_1.publish
  allow(Time.zone).to receive(:now).and_return(Time.now)
  get :show, format: :json, params: { id: movie_1.uuid }
end

it 'should return the rec_1 in page format' do
 expect(response_body_json).to eql(Preseneter.new(ActiveRecordObject).page)
end

end

Приведенный выше код разрешил мою проблему.

Похоже, я указал allow(Time.zone).to receive(:now).and_return('hello') не в том месте.Он должен быть помещен в блок before, чтобы он устанавливался до запуска тестового примера, и я думаю, что, вероятно, он должен быть установлен и перед запросом get.

Однако подход Тома Лорда - лучший подход.

0 голосов
/ 28 ноября 2018

Поскольку вы не показали, как определяются response_body_json и Presenter#page, я не могу точно ответить, почему ваша текущая попытка не работает.

Однако я могу вместо этого сказать, что использовал быдругой подход.

Существует два стандартных способа написания таких тестов:

  1. Время замораживания .

Предполагая, что вы 'Если вы используете относительно современную версию рельсов, вы можете использовать ActiveSupport::Testing::TimeHelpers#freeze_time где-нибудь в тесте, например что-то вроде:

around do |example|
  freeze_time { example.run }
end

it 'should return the movie_1 in page format' do
  expect(response_body_json).to eql(Presenter.new(ActiveRecordObject).page)
end

Если вы старшеВерсия rails, вам может понадобиться использовать travel_to(Time.zone.now).

И если вы используете очень старую версию rails (или проект не-rails!), в котором нет этой вспомогательной библиотеки, вывместо этого можно использовать timecop.

Используйте нечеткое сопоставление для меток времени (например, be_within).Что-то вроде:

.

it 'should return the movie_1 in page format' do
  expected_json = Presenter.new(ActiveRecordObject).page
  expect(response_body_json).to match(
    expected_json.merge(updated_at: be_within(3.seconds).of(Time.zone.now))
  )
end
...