2017-11-12 2 views
-1

레일즈 앱에서 데이터베이스 클리너를 작동시키는 방법에 대한 지침이 필요합니다. 기록의 ID는 각 테스트마다 계속 증가하며 닦아 내지 않습니다.레일즈 + Rspec : 데이터베이스 클리너 젬이 작동하지 않습니다.

나는 데이터베이스 클리너가 작동하고 실패했는지 확인하기위한 테스트를 설정했습니다.

사양/모델/문제/database_cleaner_test.rb

require 'rails_helper' 

describe "db_cleaner" do 

    let!(:article) { FactoryGirl.create(:article) } 

    it "first test" do 
     expect(Article.all.count).to eq(1) 
     expect(Article.last.id).to eq(1) 
    end 

    it "should clean db" do 
     expect(Article.all.count).to eq(1) 
     expect(Article.last.id).to eq(1) 
    end 

end 

실패 :

1) db_cleaner should clean db 
    Failure/Error: expect(Article.last.id).to eq(1) 

     expected: 1 
      got: 2 

     (compared using ==) 

설정 : 여기

gem 'rails', '~> 5.1.2' 
gem 'pg', '~> 0.18' 

group :development, :test do 
    gem 'rspec-rails', '~> 3.6', '>= 3.6.1' 
    gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] 
    gem 'capybara', '2.7.1' 
    gem 'capybara-webkit' 
    gem 'database_cleaner', '~> 1.6', '>= 1.6.2' 
    gem 'capybara-screenshot' 
    gem 'factory_girl_rails', '~> 4.8' 
end 

내가 내 레일에서 볼 것입니다 테스트 콘솔 nd 유형을

DatabaseCleaner.clean 

=> [#<DatabaseCleaner::Base:0x00000005e09368 @orm=:active_record, @strategy=#<DatabaseCleaner::ActiveRecord::Transaction:0x00000005e08f58 @db=:default, @connection_class=ActiveRecord::Base>, @db=:default>] 

readme에서 데이터베이스 청소기 권장 구성을 복사하여 붙여 넣었습니다. 작동하지 않습니다.

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' 
Capybara.javascript_driver = :webkit 
Capybara.server = :puma 
require 'capybara/rails' 
require 'capybara/rspec' 
require 'capybara-screenshot/rspec' 
require 'capybara/webkit/matchers' 
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 
Capybara.ignore_hidden_elements = false 

ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 

    config.fixture_path = "#{::Rails.root}/spec/fixtures" 
RSpec.configure do |config| 

    config.use_transactional_fixtures = false 

    config.before(:suite) do 
    if config.use_transactional_fixtures? 
     raise(<<-MSG) 
     Delete line `config.use_transactional_fixtures = true` from rails_helper.rb 
     (or set it to false) to prevent uncommitted transactions being used in 
     JavaScript-dependent specs. 

     During testing, the app-under-test that the browser driver connects to 
     uses a different database connection to the database connection used by 
     the spec. The app's database connection would not be able to access 
     uncommitted transaction data setup over the spec's database connection. 
     MSG 
    end 
    DatabaseCleaner.clean_with(:truncation) 
    end 

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

    config.before(:each, type: :feature) do 
    # :rack_test driver's Rack app under test shares database connection 
    # with the specs, so continue to use transaction strategy for speed. 
    driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test 

    if !driver_shares_db_connection_with_specs 
     # Driver is probably for an external browser with an app 
     # under test that does *not* share a database connection with the 
     # specs, so use truncation strategy. 
     DatabaseCleaner.strategy = :truncation 
    end 
    end 

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

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

    config.infer_spec_type_from_file_location! 
    config.filter_rails_from_backtrace! 
    config.include FactoryGirl::Syntax::Methods 
    config.include(Capybara::Webkit::RspecMatchers, :type => :feature) 
    config.include Warden::Test::Helpers 
    Warden.test_mode! 
    config.after :each do 
    Warden.test_reset! 
    end 
end 

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

RSpec::Matchers.define :appear_before do |later_content| 
    match do |earlier_content| 
    page.body.index(earlier_content) < page.body.index(later_content) 
    end 
end 

나는이 자습서를 참조하고 RSpec에 설정을 쥐게하지만,이 역시 도움이되지 않습니다 않은 : 여기에 내 전체 rails_helper.rb 파일이 (내가 카피 바라의 웹킷과 RSpec을 사용하고 있습니다).

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 'database_cleaner' 
require 'spec_helper' 
require 'rspec/rails' 
Capybara.javascript_driver = :webkit 
Capybara.server = :puma 
require 'capybara/rails' 
require 'capybara/rspec' 
require 'capybara-screenshot/rspec' 
require 'capybara/webkit/matchers' 
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 
Capybara.ignore_hidden_elements = false 
Capybara::Screenshot.autosave_on_failure = false 

ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 

    config.fixture_path = "#{::Rails.root}/spec/fixtures" 
    config.use_transactional_fixtures = false 
    config.infer_spec_type_from_file_location! 
    config.filter_rails_from_backtrace! 
    config.include FactoryGirl::Syntax::Methods 
    config.include(Capybara::Webkit::RspecMatchers, :type => :feature) 
    config.include Warden::Test::Helpers 
    Warden.test_mode! 
    config.after :each do 
    Warden.test_reset! 
    end 

    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 

Capybara::Webkit.configure do |config| 
    config.block_unknown_urls 
end 
+0

공유 할 수있는 문제가 재현 된 Repo가 있습니까? –

+0

실제로'rspec-rails'가 작동하는 것처럼 보이는 트랜잭션 제어 ('count' 기대가 깨지지 않기 때문에). 순차적 ID 만 재설정되지 않습니다 ... 왜 테스트에 문제가 있습니까? –

답변

0

데이터베이스 청소기로 자동 증가 ID의 동작은 사용 된 특정 데이터베이스와 (잘라 내기, 삭제, 거래)를 사용하는 청소의 방법에 따라 달라집니다. 즉, 특정 ID에 의존해서는 안되기 때문에 테스트와 관련이 없어야합니다.

관련 문제