我在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=
答案 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
我还倾向于从开发中保留一个单独的测试数据库,只是为了提高速度并让我的生活更轻松。