У меня есть функция, которая отлично работает на производстве и в разработке, но тест, который я написал для нее, не проходит. Кажется, что данные не сохраняются, хотя, когда я использую byebug, это показывает, что все в порядке.
Вот мое spe c:
it "cancels a user plan" do
plan = FactoryBot.create(:plan, name: 'MOMLab', paypal_id: 'MOMLab15')
user = FactoryBot.create(:user, email: 'payer@email.com',
payer_id: '6M5AMEDMVMSNL')
user_plan = FactoryBot.create(:user_plan, user: user, plan: plan, end_date: nil)
ipn = FactoryBot.create(:ipn, :cancelation)
sign_in FactoryBot.create(:user, :admin)
visit ipn_path(ipn)
expect(user_plan.status).to eq('Active')
click_on 'Process'
sleep 10
expect(ipn.reload.complete?).to be_truthy
expect(user_plan.reload.end_date.to_date).to eq(Time.zone.now.to_date)
expect(user_plan.status).to eq('Canceled')
end
Вот код:
def cancel_subscription
@user = find_user
@user_plan = @plan.user_plans.where(user: @user).active.first
if @user_plan
@user_plan.end_date = Time.zone.now
@user_plan.status = 'Canceled'
@user_plan.save!
if @user_plan.persisted?
@ipn.update(complete: true)
else
handle_errors("User plan didn't save")
end
else
handle_errors("Couldn't find subscription")
end
end
Я поместил объект с inspect
во время выполнения и в тесте - при выполнении кажется, что все в порядке, и изменения сохранились (он входит в постоянное дерево? Но снаружи в тесте он показывает как будто объект никогда не был сохранен.
Есть идеи?
Редактировать:
Вот мой rails_helper.rb
:
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
require "capybara/rspec"
require 'devise'
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.register_driver :headless_chrome do |app|
caps = Selenium::WebDriver::Remote::Capabilities.chrome(loggingPrefs: { browser: 'ALL' })
opts = Selenium::WebDriver::Chrome::Options.new
chrome_args = %w[--headless --no-sandbox --disable-gpu --window-size=1920,1080 --remote-debugging-port=9222]
chrome_args.each { |arg| opts.add_argument(arg) }
Capybara::Selenium::Driver.new(app, browser: :chrome, options: opts, desired_capabilities: caps)
end
Capybara.javascript_driver = :headless_chrome
Capybara.current_driver = :headless_chrome
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.include Devise::Test::IntegrationHelpers, type: :feature
config.include Devise::Test::IntegrationHelpers, type: :request
config.infer_spec_type_from_file_location!
config.include Warden::Test::Helpers
Warden.test_mode!
config.use_transactional_fixtures = true
config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace!
end
и мой spec_helper.rb
:
require 'webmock/rspec'
require 'capybara/rspec'
include WebMock::API
require 'etsy'
RSpec.configure do |config|
Capybara.default_max_wait_time = 10
Capybara.register_driver :insecure_selenium do |app|
Capybara::Selenium::Driver.new(
app,
browser: :firefox,
desired_capabilities: { accept_insecure_certs: true }
)
end
config.expect_with :rspec do |expectations|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = true
end
config.shared_context_metadata_behavior = :apply_to_host_groups
begin
config.filter_run_when_matching :focus
config.example_status_persistence_file_path = "spec/examples.txt"
config.disable_monkey_patching!
if config.files_to_run.one?
config.default_formatter = "doc"
end=
config.profile_examples = 3
Kernel.srand config.seed
end
end