8

Rails 3.1 アプリケーションに次の spec_helper.rb ファイルがあります。私は Spork を使用して、テストのために環境をより高速にロードしています。Spork をミックスに追加する前に、すべてのテストが機能していました。spork を追加した後、テスト実行の間にテスト データベースが適切にクリアされず、私の期待の一部が失われました。

他の指示に従って、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

更新: ここに私の database.yml ファイルがあります

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 呼び出しを before(:each) セクションに移動することで基本的な問題を回避しましたが、これによりテストの実行が大幅に遅くなります。

4

2 に答える 2

3

ブロックENV["RAILS_ENV"] ||= 'test'から出ようとしましたか?Spork.prefork

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

ところで、切り捨て戦略を使用している場合は、を実行する必要はありませんDatabaseCleaner.start

于 2012-02-20T10:04:13.197 に答える
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 が必要になり、トランザクション フィクスチャを無効にする必要があります。

于 2012-11-23T05:35:07.810 に答える