2011-09-29 4 views
8

Rails 3.1 응용 프로그램에 다음과 같은 spec_helper.rb 파일이 있습니다. Spork을 사용하여 테스트 환경을 더 빨리로드합니다. 모든 테스트는 Spork를 믹스에 추가하기 전에 수행되었습니다. spork을 추가 한 후, 테스트 데이터베이스는 제 기대치를 버리는 테스트 실행 사이에서 제대로 지워지지 않았습니다.Spork, RSpec 및 database_cleaner가 개발 데이터베이스를 파손합니다.

다른 지침에 따라 database_cleaner를 아래 코드와 함께 추가했습니다. 그러나 이제는 개발 데이터베이스가 테스트 데이터베이스와 함께 정리되고 있습니다. 이 호출 중에 ENV [ "RAILS_ENV"] 호출이 테스트를 반환합니다.

DatabaseCleaner.clean_with (: truncation)에 대한 호출을 테스트 데이터베이스에만 영향을 미치도록 명시 적으로 제한하는 방법이 있습니까?

require 'rubygems' 
require 'spork' 

Spork.prefork do 
    ENV["RAILS_ENV"] ||= 'test' 
    require File.expand_path("../../config/environment", __FILE__) 
    require 'rspec/rails' 
    require 'shoulda/matchers/integrations/rspec' 
    require 'database_cleaner' 

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

    RSpec.configure do |config| 
    config.mock_with :mocha 

    config.formatter = 'documentation' 
    config.use_transactional_fixtures = true 

    config.before(:suite) do 
     DatabaseCleaner.strategy = :truncation 
    end 

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

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

Spork.each_run do 
    FactoryGirl.reload 
end 

업데이트 : (각) 여기에 또

development: 
    adapter: sqlite3 
    database: db/development.sqlite3 
    pool: 5 
    timeout: 5000 

test: 
    adapter: sqlite3 
    database: db/test.sqlite3 
    pool: 5 
    timeout: 5000 

production: 
    adapter: sqlite3 
    database: db/production.sqlite3 
    pool: 5 
    timeout: 5000 

, 내가 이전에 clean_with 통화를 이동하여 기본 문제를 해결 일한 내 database.yml을 파일입니다 부분,하지만 속도가 느려집니다 테스트가 크게 실행됩니다.

+0

당신의'database.yml'은 무엇입니까? – Bohdan

+0

정보를 포함하도록 질문을 업데이트했습니다. –

+2

나는 또한 같은 문제에 직면하고 있습니다. 현재 이런 일이 일어나지 않도록 RAILS_ENV = test bundle exec rake spec을 사용합니다. – subosito

답변

3

ENV["RAILS_ENV"] ||= 'test' 블록을 Spork.prefork 블록 밖으로 이동하려고 시도 했습니까?

Spork에서 DB가 치료되지 않았습니까? RSpec의 트랜잭션 픽스쳐를 사용한다면, 그럴 가능성이있는 것은 before(:all) 블록 내의 팩토리를 사용하는 것뿐입니다. after(:all) 블록의 데이터를 지우고 DatabaseCleaner를 제거 할 수 있습니다.

현재 truncation 전략을 사용하는 경우 DatabaseCleaner.start을 실행할 필요가 없습니다.

1

RAILS_ENV가 명시 적으로 "개발"으로 설정되어 있습니까? 그렇다면 기본 spec_helper는 개발 DB에 대해 테스트를 실행합니다. vim 내부에서 테스트를 실행하거나 명령 줄에서 rspec을 실행하면 개발 DB에 대해 테스트가 실행됩니다.

database_cleaner를 사용해야 할 때 명시 적으로 RAILS_ENV를 spec_helper에서 테스트하여 내 개발 DB를 보호하려고합니다. 트랜잭션 픽스쳐가 아닌 다른 것을 사용할 때는 항상 좋은 생각입니다.

트랜잭션 픽스쳐와 database_cleaner를 모두 사용하고 있습니다. DB가 트랜잭션을 지원하는 경우 database_cleaner는 전혀 필요하지 않습니다. Mongo를 사용하거나 capybara-webkit 테스트를 실행중인 경우 database_cleaner가 필요하며 트랜잭션 픽스처를 사용하지 않으려합니다.

관련 문제