Rails Rspe c показывает результаты, отличные от консольных - PullRequest
1 голос
/ 08 января 2020

У меня есть функция, которая отлично работает на производстве и в разработке, но тест, который я написал для нее, не проходит. Кажется, что данные не сохраняются, хотя, когда я использую 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
...