1

作成したテスト オブジェクトを適切にクリーンアップできるように、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
4

0 に答える 0