我正在运行rails 3.0.3并使用带有postgresql数据库的rspec-rails 2.4.1。每当我运行RSpec测试时,数据都会保留在最后。有没有人知道如何让rails或rspec在每次使用之间擦除测试环境的数据?
请告诉我是否有任何进一步的信息可以让我更轻松地回答我的问题。
谢谢!
特里斯坦
答案 0 :(得分:10)
安装database_cleaner gem,然后将其添加到spec_helper.rb。
Spec::Runner.configure do |config|
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
答案 1 :(得分:5)
使用事务示例在每次测试运行后回滚数据
RSpec.configure do |config|
config.use_transactional_examples = true
end
答案 2 :(得分:1)
为了在运行之间清理测试数据库,您不需要任何额外的gem。在spec_helper.rb文件中,按如下方式配置rspec:
RSpec.configure do |c|
c.around(:each) do |example|
ActiveRecord::Base.connection.transaction do
example.run
raise ActiveRecord::Rollback
end
end
end
答案 3 :(得分:0)
我刚刚完成的另一种可能性是使用了错误的before
块。
我不小心将before
块设置为all
而不是each
:
before :all do
user = FactoryGirl.create(:user)
sign_in user
end
这导致user
在整个rspec
运行的数据库中停留,导致验证冲突。
相反,before
应该是each
,以便通过rspec
运行保持一切清洁:
before :each do
user = FactoryGirl.create(:user)
sign_in user
end
如果您犯了这个错误,那么在事情恢复正常之前,您可能需要手动清理测试数据库。最简单的方法是截断每个表(除了schema_migrations
)。