симулировать текущую дату во время тестов - PullRequest
4 голосов
/ 14 декабря 2010

Я пишу тесты, и мне интересно, есть ли способ изменить текущую дату во время моего теста?

Дело в том, что я тестирую статистические функции приложения, которое связано с отслеживаниеммодель, которая создает экземпляр каждый раз, когда вызывается действие (отслеживаются только некоторые действия с помощью вызова before_filter only)

Поэтому мне нужно вызывать эти действия в разных контроллерах в разные моменты времени, чтобы проверить моикомпонент аналитики делает правильные вычисления, но я не нашел способа реализовать change_current_time в следующем примере кода:

test "login count" do
  change_current_time(2.day.ago)
  get "users/login/testuser/testpassword"
  assert login_count(2.day.ago) == 1
  change_current_time(1.day.ago)
  get "users/login/testuser/testpassword"
  get "users/login/testuser1/testpassword1"
  assert login_count(1.day.ago) == 2
end

Ответы [ 5 ]

5 голосов
/ 14 декабря 2010

Для такого рода вещей есть куча драгоценных камней.Мой любимый delorean: https://github.com/bebanjo/delorean

1 голос
/ 11 июня 2017

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

time = 2.days.ago
travel_to(time)

Источник: http://api.rubyonrails.org/v5.1/classes/ActiveSupport/Testing/TimeHelpers.html

1 голос
/ 14 декабря 2010

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

http://en.wikipedia.org/wiki/Mock_object

Идея состоит в том, что вы можете создать идентичную функцию, кромедля передачи даты вместо того, чтобы полагаться на текущую дату, и проверить это вместо этого.Трудность заключается в том, чтобы удостовериться, что эти две функции действительно эквивалентны, и синхронизировать любые изменения в них.

Существуют фреймворки и такие для насмешек, но я не совсем знаком с ними, чтобырекомендую его вам.

0 голосов
/ 06 августа 2014

Этот камень выглядит интересным и ухоженным: https://github.com/travisjeffery/timecop

0 голосов
/ 14 декабря 2010

В Rails есть жемчужина для насмешливого времени.
https://github.com/harvesthq/time-warp

time = (2.days.ago)

pretend_now_is(time) do
  get "users/login/testuser/testpassword"
  assert login_count(Date.today) == 1 # it's stubbed
end

time = (1.days.ago)

pretend_now_is(time) do
  get "users/login/testuser/testpassword"
  get "users/login/testuser1/testpassword1"
  assert login_count(Date.today) == 2
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...