Тестирование через x дней с помощью timecop

#ruby-on-rails #ruby

Вопрос:

У меня есть account модель, в которой есть trial_ends_at поле, которое я хотел бы задать 30.days.from_now , когда пользователь создает учетную запись.

Я использую RSpec и timecop для тестирования пробного периода, но не смог этого сделать.

Прогресс до сих пор

 it "sets the trial_ends_at to 30 days from now" do
  post admin_accounts_path, params: { account: { name: "My company", subdomain: "example" } }

  Timecop.freeze(Time.zone.today   30) do
    expect(Account.first.trial_ends_at).to eq(30.days.from_now)
  end
end
 

Тест не проходит.

Поочередно я также пытался

 it "sets the trial_ends_at to 30 days from now" do
  post admin_accounts_path, params: { account: { name: "My company", subdomain: "example" } }

  Timecop.freeze(Time.zone.today   30) do
    expect(Account.first.on_generic_trial?).to be_truthy
  end
end
 

Этот тест хрупок. Он проходит 30.days.from_now и терпит неудачу, если испытание установлено ниже этого, но проходит, если испытание установлено выше этого, например: 50.days.from_now .

on_generic_trial? Метод взят из драгоценного камня оплаты.

Комментарии:

1. Кстати, в более новых версиях Rails вы можете сделать это без временных ограничений 🙂

2. @FrankGroeneveld Можете ли вы поделиться своим решением?

Ответ №1:

ваш код выглядит примерно так: создайте учетную запись и установите trial_ends_at = Time.now 30 days , затем перейдите к следующему месяцу, затем попытайтесь ожидать, что trial_ends_at это будет равно следующему месяцу следующего месяца, поэтому это не удалось. Давайте попробуем:

 it "sets the trial_ends_at to 30 days from now" do
  Timecop.freeze(Time.zone.today) do
    post admin_accounts_path, params: { account: { name: "My company", subdomain: "example" } }
    expect(Account.first.trial_ends_at).to eq(30.days.from_now)
  end
end