rspec清理数据库在运行之前

时间:2014-08-26 02:30:10

标签: 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

我收到以下错误:

undefined method `use_transactional_fixtures=' for #<RSpec::Core::Configuration:0x007fc1c89397e8> (NoMethodError)`

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

我最初的想法是创建一个运行db:drop,db:create和db:migrate以及测试的Rakefile,但我希望有一个像use_transactional_fixtures=

1 个答案:

答案 0 :(得分:9)

我使用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

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