2017-04-23 15 views
0

많은 Rails 프로젝트에서 Capybara와 Capybara-webkit과 함께 RSpec을 사용했으며 일반적으로 원활하게 작동합니다. 웬일인지 이번에는 js: true 기능 사양을 구성하는 데 문제가 있습니다. 그들은 데이터베이스와 제대로 상호 작용하지 않습니다. 나는 factory_girldatabase_cleaner을 사용하여 테스트 db 내용을 관리합니다. js: true 테스트의 경우 DatabaseCleaner.strategy = :truncationdatabase_cleaner.rb인데도 여전히 작동하지 않습니다. 이상하게도, ActiveRecord::Base.establish_connectiondatabse_cleaner.rb에 넣으면 테스트가 잘됩니다. 왜?? 여기capybara-webkit js : true rspec 테스트가 데이터베이스와 상호 작용할 수 없음

rails_helper.rb입니다 :이 변경하면

RSpec.configure do |config| 
    config.before(:suite) do 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.strategy = :transaction 
    end 

    config.before(:each, js: true) do 
    DatabaseCleaner.strategy = :truncation 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 
end 

:이 (spec/support에 위치) database_cleaner.rb입니다

ENV['RAILS_ENV'] ||= 'test' 

ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__) 
require 'bundler/setup' 
Bundler.require 
require 'pry-byebug' 
require 'capybara/rspec' 
require 'capybara/webkit' 
require 'database_cleaner' 
require 'webmock/rspec' 

WebMock.disable_net_connect!(allow_localhost: true) 

# use `describe 'Feature', type: :feature, js: true` to use this driver 
Capybara.javascript_driver = :webkit 

# tests use regular (faster) driver if they don't require js 
Capybara.default_driver = :rack_test 

Capybara::Webkit.configure do |config| 
    config.allow_unknown_urls 
end 

RSpec.configure do |config| 
    config.after(:suite) do 
    FileUtils.rm_rf(Dir["#{Rails.root}/spec/test_files/"]) 
    end 

    config.include Capybara::DSL 
... 

:

# This file is copied to spec/ when you run 'rails generate rspec:install' 
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 'spec_helper' 
require 'rspec/rails' 

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } 

ActiveRecord::Migration.maintain_test_schema! 

Capybara::Webkit.configure(&:block_unknown_urls) 

RSpec.configure do |config| 
    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    config.use_transactional_fixtures = false 

    config.infer_spec_type_from_file_location! 

    # Filter lines from Rails gems in backtraces. 
    config.filter_rails_from_backtrace! 
    # arbitrary gems may also be filtered via: 
    # config.filter_gems_from_backtrace("gem name") 
end 

이 중요한 spec_helper.rb의 일부입니다 , 테스트는 th와 상호 작용할 수 있습니다. 전자 db 제대로 :

config.before(:each, js: true) do 
    ActiveRecord::Base.establish_connection 
    DatabaseCleaner.strategy = :truncation 
end 

왜? DB 연결을 설정하기 위해 명시 적으로 말해야 할 필요는 없습니다.

+0

어떤 버전이 표시되지 않는 이유는 무엇입니까? –

답변

0

js: true으로 설정하면 본질적으로 셀 륨 기반 브라우저 요청 인 Capybara 만 사용하고있는 것입니다. 테스트 프로세스 외부에서 실행중인 코드 (예 : Selenium 브라우저 요청)에는 데이터베이스 픽스처가 표시되지 않습니다.

Selenium 웹 서버에서 데이터 상태를 공유하고 코드 자체를 테스트하는 것이 바람직합니다.

어딘가에 Rspec.config (아마도 당신의 database_cleaner.rb), 당신은

config.use_transactional_fixtures = false 

"RSpec에와 매일 레일 테스트는"때때로 특정 테스트 시나리오에 필요했던 트릭을 가지고

설정할 수 있습니다 어디

사양/지원/shared_db_connection.rb 파일을 확인하고이 내용 추가 :

그것을 아래 댓글에서 지적했듯이 다른 문제가 발생할 수 있지만 레일 5. 이전과 동일한 DB 연결을 공유 할 필요가
class ActiveRecord::Base 
    mattr_accessor :shared_connection 
    @@shared_connection = nil 

    def self.connection 
    @@shared_connection || retrieve_connection 
    end 
end 
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 
+0

Selenium이 아닌 webkit을 사용하고 있습니다. 또한'rails_helper.rb' 파일에'config.use_transactional_fixtures = false'가 있습니다.이 설정은 과거에 공유 연결을 만드는 추가 코드없이 잘 작동했습니다. –

+0

Rails 5.1 이전에는 공유 데이터베이스 연결로 인해 ActionCable 같은 것을 App에 추가하기 시작하거나 기능 테스트에서 DB 체크를하고있는 경우 (잘못된 생각이지만 많은 사람들이 그것을 수행합니다), 디버깅이 어렵습니다. Rails 5.1은 하나의 연결을 안전하게 공유하는 테스트 모드에서 연결 풀 주변에 잠금 기능을 추가했습니다. –

+0

좋은 지적. 내 대답을 수정하겠습니다. – codelitt

1

귀하의 질문에 : 거래는 귀하의 js 테스트에 대한 코드를 보여줍니다 : 절단. 자르기는 js 테스트에 사용해야하는 것이므로 질문이 오타라고 가정합니다.

당신은 권장 database_cleaner 사용한다 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example - 절단이 '의 JS : 사실'보다는 사용중인 드라이버에 따라 필요 여부를 감지 메타 데이터도 시험을 위해 아주 중요하다, 단지 after보다는 append_after 사용을 안정.

나는 또한 당신의 rails_helper 어디서나 require 'capybara/rails' 또는 spec_helper 레일의

+0

덕분에 많은 워드 프로세서 문서가 제대로 작동했습니다. 올바른 방향으로 나를 가리켜 주셔서 감사합니다, 완전히 이해가됩니다. 그리고 네,': transaction'은 내가 고친 오타였습니다. –