rspec清理数据库在运行之前

Hug*_*ugo 2 ruby activerecord rspec sinatra

我在Sinatra项目中使用RSpec.我正在测试一个运行after_find钩子的模型来初始化一些值.我需要在每次运行之前擦除数据库,经过一些搜索后,我的规范帮助文件如下所示:

require "pry"
require "factory_girl_rails"
require "rspec-rails"

FactoryGirl.find_definitions

ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

RSpec.configure do |config|
  config.use_transactional_fixtures = true
end
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

undefined method `use_transactional_fixtures=' for #<RSpec::Core::Configuration:0x007fc1c89397e8> (NoMethodError)`
Run Code Online (Sandbox Code Playgroud)

我查阅了RSpec :: Core :: Configuration的文档,唯一提到的use_transactional_fixtures=是它特别指出它是特定于rails的.我安装了'rspec-rails'宝石,所以我不知道它为什么不使用它.我甚至在spec帮助文件中要求它.

我最初的想法是创建一个运行db:drop,db:create和db:migrate然后测试的Rakefile,但我希望有一个稍微简单的方法 use_transactional_fixtures=

iai*_*ain 11

我使用Database Cleaner来做到这一点.这是我在一个spec_helper.rb旧的东西!

RSpec.configure do |config|
  # Clean up the database
  require 'database_cleaner'
  config.before(:suite) do
    DatabaseCleaner.orm = "sequel"
    DatabaseCleaner.clean_with :truncation, {:only => %w{LIST OF TABLES HERE} } 
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each, :database) do
    # open transaction
    DatabaseCleaner.start
  end

  config.after(:each, :database) do
    DatabaseCleaner.clean
  end
end
Run Code Online (Sandbox Code Playgroud)

我还倾向于在开发过程中保留一个单独的测试数据库,只是为了提高速度并让我的生活更轻松.