QA@IT

Sinatra+ActiveRecordでDatabaseCleanerがうまく動かない

2642 PV

SinatraとActiveRecordで開発しています。生成したテストデータの削除にDatabaseCleanerを使おうとしているのですが、以下のようなエラーが起きてしまいます。対処法が分かる方がいらっしゃれば、ご教授いただきたいです。また、そもそもDatabaseCleanerを使うべきじゃない、といったご意見でもかまいません。宜しくお願いします。

Exception encountered: #<DatabaseCleaner::NoORMDetected: No known ORM was detected!  Is ActiveRecord, DataMapper, Sequel, MongoMapper, Mongoid, or CouchPotato loaded?> 
backtrace:
/Users/naoty/workspace/sinatra/bookmark/vendor/bundle/ruby/1.9.1/gems/database_cleaner-0.9.1/lib/database_cleaner/base.rb:124:in `autodetect'
/Users/naoty/workspace/sinatra/bookmark/vendor/bundle/ruby/1.9.1/gems/database_cleaner-0.9.1/lib/database_cleaner/base.rb:7:in `initialize'
/Users/naoty/workspace/sinatra/bookmark/vendor/bundle/ruby/1.9.1/gems/database_cleaner-0.9.1/lib/database_cleaner/configuration.rb:46:in `new'
/Users/naoty/workspace/sinatra/bookmark/vendor/bundle/ruby/1.9.1/gems/database_cleaner-0.9.1/lib/database_cleaner/configuration.rb:46:in `connections'
/Users/naoty/workspace/sinatra/bookmark/vendor/bundle/ruby/1.9.1/gems/database_cleaner-0.9.1/lib/database_cleaner/configuration.rb:65:in `strategy='
/Users/naoty/workspace/sinatra/bookmark/spec/spec_helper.rb:11:in `block (3 levels) in <top (required)>'

Gemfileとspec_helperはそれぞれ以下のような感じです。

# Gemfile
source :rubygems

gem 'sinatra'
gem 'sinatra-activerecord'

group :development, :test do
  gem 'rspec'
  gem 'rack-test'
  gem 'fabrication'
  gem 'database_cleaner'
  gem 'spork'
end
# spec/spec_helper.rb

require 'rspec'
require 'rack/test'
require 'fabrication'
require 'database_cleaner'

Spork.prefork do
  RSpec.configure do |config|
    config.include Rack::Test::Methods

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

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

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

  Fabrication.configure do |config|
    config.path_prefix = '../../'
  end
end

Spork.each_run do
  require File.expand_path('../../bookmark', __FILE__)

  module SinatraApplication
    def app
      Bookmark
    end
  end

  RSpec.configure do |config|
    config.include SinatraApplication
  end
end

回答

例外のスタックトレースを見る限り、DatabaseCleaner.strategy = :transaction の時点で ActiveRecord がロードされていないのが原因に見えます。

たぶん ../../bookmark で ActiveRecord をロードしてるでしょうから require File.expand_path('../../bookmark', __FILE__)Spork.prefork do の次の行あたりに移してみてはいかがでしょうか?

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。