2011-09-29 16 views
8

Rails 3.1アプリケーションに以下のspec_helper.rbファイルがあります。私はテストのために環境をより速くロードするためにSporkを使用しています。すべての私のテストは、Sporkをミックスに追加する前に動作しました。 sporkを追加した後、テストデータベースは、私の期待の一部を破棄したテストラン間で適切にクリアされていませんでした。Spork、RSpec、database_cleanerが開発データベースを破棄しています

他の命令に続いて、私は以下に記載するコードとミックスにdatabase_cleanerを追加しました。しかし、現在、開発データベースはテストデータベースと同様にクリーンアップされています。この呼び出し中にENV ["RAILS_ENV"]コールがテストを返しています。

明示的DatabaseCleaner.clean_withのためのコールを制限する方法があります:のみテスト・データベースに影響を与える(切り捨て)は?

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

あなたはSpork.preforkブロックの外にENV["RAILS_ENV"] ||= 'test'を移動しようとしたことがありますか?

あなたのDBが汚れてしまったと確信していますか? RSpecのトランザクションフィクスチャを使用している場合、そのようなことにつながる唯一のことは、before(:all)ブロック内のファクトリを使用することです。 after(:all)ブロックのデータをクリーンアップし、DatabaseCleanerを取り除くことができます。あなたは切り捨て戦略を使用している場合

ところで、DatabaseCleaner.startを実行する必要はありません。

1

RAILS_ENVは明示的に「開発」に設定されていますか?その場合、デフォルトのspec_helperは開発DBに対してテストを実行します。 vimの中からテストを実行するか、コマンドラインでrspecを実行すると、開発DBに対してテストが実行されます。私はdatabase_cleanerを使用するように強制してい

は、私は明示的に私の開発DBを保護するためにspec_helperでテストするRAILS_ENVを設定したいです。トランザクショナル・フィクスチャー以外のものを使用しているときは、これが良い考えです。

私はあなたがトランザクションの備品とdatabase_cleanerの両方を使用していることに注意してください。 DBがトランザクションをサポートしている場合、database_cleanerはまったく必要ありません。 Mongoを使用している場合、またはcapybara-webkitテストを実行している場合は、database_cleanerが必要です。トランザクションフィクスチャを無効にする必要があります。

関連する問題