Rails / Heroku тестируют будущее время - PullRequest
0 голосов
/ 15 октября 2019

У меня есть множество функций, которые зависят от срока годности и будущего времени, мы используем timecop в наших тестах rspec / unit, но мне было интересно, есть ли у кого-нибудь какие-нибудь умные решения для того, как продукт / специалист по QA могли бы эмулировать какое-то время в будущемкогда они тестируют функцию, например, можно ли запустить сервер heroku на основе переменной среды с некоторым временем в будущем и т. д.

Например, у вас есть купон с отметкой времени expires_at 3 дняв будущем, если бы я хотел, чтобы моя команда QA / product могла быстро увидеть это состояние, где оно истекло, есть ли умный способ сделать это, обманув сервер каким-то образом? Мы могли бы создать инструменты для автоматической настройки истечения срока действия записей в текущее время и т. Д. Но когда вы начинаете иметь множество функций, которые имеют такую ​​будущую логику, основанную на времени, это становится более неприятным

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

В будущем невозможно протестировать производственную среду. Даже если бы это было так, это не имело бы смысла. Все, что вас должно беспокоить - это работает ли оно прямо сейчас. 2 высокоуровневых вопроса: ...

  1. Работает ли это в ваших средах разработки / тестирования (другими словами, правильна ли логика?)

  2. Предоставляет ли ваша производственная служба какой-либо тип управления задачами и насколько он надежен?

Поскольку вы используете Heroku и не указали точную проблему, с которой сталкиваетесь, давайте просто скажем, что вы используете Heroku Scheduler, в качестве примера.

Если логика вашего приложения верна и вы можете запустить задачу с помощью $ heroku run rails your_task, то вам нечего тестировать. Вы можете быть уверены, что это сработает. Все, кроме этого, будет проверять саму Heroku (или какую-либо производственную службу, которую вы используете).

0 голосов
/ 16 октября 2019

Вы можете написать часть промежуточного программного обеспечения, которое использует Timecop для изменения времени в вашей промежуточной среде:

# /app/middlewares/time_traveler.rb
class TimeTraveler
  def initialize(app)
    @app = app
  end

  def call(env)
    Timecop.travel(Time.local(2015, 10, 21, 12, 0, 0)) do
      Rails.logger.info('Great Scott!')
      @app.call(env)
    end
  end
end
# /config/environments/staging.rb
Rails.application.configure do
  # ...
  config.middleware.use TimeTraveler
end

Это использует фиксированное время, но вы можете использовать ввод из запроса (env. запрос), такие как параметры, заголовки или файлы cookie.

Однако это только меняет интерпретацию времени в Rubys. А не:

  • Базы данных о времени. Например, любой код, использующий функцию SQL NOW(), может сломаться.
  • Системное время. Любые задания cron или повторяющиеся задачи будут по-прежнему выполняться на разных часах.
  • Время в клиенте. Кеши будут недействительными. Все может сломаться.

Я бы не подумал сделать это на реальном производственном сервере хорошей идеей. Вместо этого настройте промежуточную среду (отдельное приложение Heroku).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...