作成したテスト オブジェクトを適切にクリーンアップできるように、RSpec を使用して DatabaseCleaner をセットアップしようとしています。DatabaseCleaner を使用しない場合、次のテストに合格します。
ただし、DatabaseCleaner コードをspec_helper.rb
ファイルに追加すると、次に示すようにテストが失敗します。
include AuthHelper
describe BulkJobsController do
describe 'GET /bulk_jobs/:id' do
context 'with valid user' do
before do
login_as('someuser')
end
context 'and a job' do
before do
@job = create(:bulk_job_close_cases)
puts "Test - Bulk Job Count: #{BulkJob.count}" # This is always 1
get :show, id: @job.id, format: 'json'
end
it 'is valid' do
response.status.should eq(200)
end
end
end
end
end
コントローラーは次のとおりです。
class BulkJobsController < ApiController
def show
puts "Controller - Bulk Job Count: #{BulkJob.count}" # This is 1 without DC and 0 with DC
@job = BulkJob.find(params[:id])
respond_with @job
end
end
私のspec/spec_helper.rb
ファイルの関連部分は次のとおりです。
####################
# Database Cleanup #
####################
require 'database_cleaner'
config.use_transactional_fixtures = false
config.after(:suite) do
ActiveRecord::Base.connection.execute("DEALLOCATE ALL")
end
config.around(:each) do |example|
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.start
example.run
DatabaseCleaner.clean
end
奇妙なことに、DatabaseCleaner.clean
ステートメントを削除しても実際にはテストに合格しません。ただし、DatabaseCleaner.start
コードを削除するとテストはパスします。
コントローラーが適切な ID を持つ BulkJob を見つけることができないため、テストは失敗しています。オブジェクトのカウントを出力すると、テスト内では BulkJobs の数は 1 ですが、コントローラー内では 0 です。テストに合格すると、明らかに、両方のスポットで数が 1 になります。
私は Capybara や Selenium を含めていないので、私が理解しているように、rspec はこの例を実行するために rack-test を使用する必要があります。
構成/テストに何か問題がありますか? DatabaseCleaner のクリーニングは早すぎますか?
失敗したテストは次のとおりです。
Failures:
1) BulkJobsController GET /bulk_jobs/:id with valid user and a job is valid
Failure/Error: get :show, id: @job.id, format: 'json'
ActiveRecord::RecordNotFound:
Couldn't find BulkJob with id=39
# ./app/controllers/bulk_jobs_controller.rb:6:in `show'
# ./spec/controllers/bulk_jobs_spec.rb:33:in `block (5 levels) in <top (required)>'
そして私のGemfile:
source 'http://rubygems.org'
gem 'rails', '~>3.2.12'
gem 'composite_primary_keys', '>=3.1.0'
gem 'sqlite3-ruby', :require => 'sqlite3'
gem 'pg'
gem 'activerecord-mysql2-adapter', '~> 0.0.3'
gem 'rake', '>=0.8.7'
gem 'dalli'
gem 'postmark-rails'
gem 'rb-readline'
gem 'statsmix'
gem 'daemons'
gem 'delayed_job_active_record'
gem 'whenever', :require => false
gem 'iron_worker'
gem 'statsmix'
gem 'exceptional'
#gem 'newrelic_rpm'
group :test do
gem 'database_cleaner'
gem 'rspec-rails'
gem 'shoulda-matchers'
gem 'factory_girl_rails'
end