RSpec + очистка базы данных, не очистка правильно
Я действительно не могу понять, почему DatabaseCleaner не очищает мою тестовую базу данных. Это то, что я получаю подсказки
1.9.2p290 :007 > DatabaseCleaner.clean
-
=> [#<DatabaseCleaner::Base:0x007fa7e4dd8b58 @autodetected=true, @orm=:active_record, @strategy=#<DatabaseCleaner::ActiveRecord::Transaction:0x007fa7e4dc14f8 @db=:default>>]
Кажется, что не правильно настроена база данных (предположительно: test), поэтому я получил решение вроде
DatabaseCleaner[:active_record, :connection => :test].clean
# => nil
Кажется, что драгоценный камень настроен правильно:
1.9.2p290 :007 > DatabaseCleaner[:active_record, :connection => :test]
#<DatabaseCleaner::Base:0x007fe8fcfd4868 @orm=:active_record, @strategy=#<DatabaseCleaner::ActiveRecord::Transaction:0x007fe8fcfd2748 @db=:test, @connection_hash={"adapter"=>"sqlite3", "database"=>"db/test.sqlite3", "pool"=>5, "timeout"=>5000}>, @db=:test>
Кажется, что правильно настроена тестовая база данных, однако она по-прежнему не собирается корректно очищать базу данных. Любые предложения?
Большое спасибо.
Ответы
Ответ 1
Даже при правильной настройке очистителя базы данных легко оставить данные, лежащие вокруг.
config.before(:suite) do
DatabaseCleaner.clean_with :truncation # clean DB of any leftover data
DatabaseCleaner.strategy = :transaction # rollback transactions between each test
Rails.application.load_seed # (optional) seed DB
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
Приведенная выше конфигурация запускает и запускает очиститель с каждой стороны теста каждый.
Если вы затем используете before :all
в своих спецификациях, вы можете получить данные, лежащие вокруг:
describe User do
# Before all is outside the before :each
before :all do
@user = User.create(:email => '[email protected]')
end
...tests here
end
Ответ 2
Здесь мой spec_helper.rb(слегка измененный) - может быть, это вам поможет?
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'database_cleaner'
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Ответ 3
У Avdi Grimm недавно был хороший пост по настройке очистителя базы данных:
http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/
Ответ 4
$ rails c test
> require 'database_cleaner'
> DatabaseCleaner.strategy = :truncation
> DatabaseCleaner.clean
https://github.com/DatabaseCleaner/database_cleaner