#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