Интеграционный тест Rspec не очищает базу данных

База данных не очищается после каждого интеграционного теста. Значение остается в базе данных.

Есть ли вариант, который я должен сделать, чтобы это произошло?

Спасибо


person donald    schedule 09.04.2011    source источник


Ответы (6)


Я думаю, что https://github.com/bmabey/database_cleaner — это то, что вам нужно.

person mikewilliamson    schedule 09.04.2011

Всем, кто использует перехватчики before(:all), следует помнить, что эти перехватчики выполняются до открытия транзакции, связанной с фикстурой. Это означает, что любые данные, созданные перехватчиками before(:all), не будут откатываться фикстурами транзакций. Вы можете прочитать больше в документации RSpec.

Я просто хотел упомянуть об этом, потому что я был укушен этим, и моим первоначальным инстинктом было перейти к очистителю базы данных (который оказался ненужным и, в конечном итоге, не работающим).

person TMcManemy    schedule 19.10.2016
comment
Спасибо! Отличный ответ! Это неочевидная ошибка RSpec. - person Kevin Hutchinson; 05.07.2018

Как подготовить тестовые базы данных для тестов Rails rspec без запуска спецификации rake?

Мой ответ может вас заинтересовать. это хорошее решение. В вашем случае вам, вероятно, понадобится что-то вроде

config.after :each do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end
person Danyel    schedule 04.08.2013

Посмотрите здесь руководство: http://railscasts.com/episodes/257-request-specs-and-capybara

Он описывает средство очистки базы данных помимо Rspec и Capybara.

person apneadiving    schedule 09.04.2011
comment
Неужели нельзя обойтись без Database Cleaner? - person donald; 10.04.2011
comment
Есть, см. мой ответ здесь: stackoverflow.com/questions/5916126/ - person Danyel; 04.08.2013

Вам нужен DatabaseCleaner, но вы можете обнаружить, что стратегия :truncation слишком медленная, чтобы работать постоянно. Это действительно необходимо только для интеграционных тестов, поэтому вы можете сделать это:

# spec/spec_helper.rb
require 'database_cleaner'
config.before(:suite) do
  DatabaseCleaner.clean_with :truncation
  DatabaseCleaner.strategy = :transaction
end

config.before(:each) do |group|
  # The strategy needs to be set before we call DatabaseCleaner.start
  case group.example.metadata[:type]
  when :feature
    DatabaseCleaner.strategy = :truncation
  else
    DatabaseCleaner.strategy = :transaction
  end
  DatabaseCleaner.start
end

config.after(:each) do
  DatabaseCleaner.clean
end

# spec/features/your_feature_spec.rb
require 'spec_helper'
describe "An integration test", :type => :feature do
end

# spec/model/your_model_spec.rb
require 'spec_helper'
describe "A unit test" do
end

Очевидно, это применимо только в том случае, если вы выполняете интеграционные тесты непосредственно с RSpec, а не с Cucumber.

person Bob Aman    schedule 28.06.2013
comment
В rspec 3.4 мы можем проверить это через group.metadata[:type] - person Clam; 02.11.2016

Есть два способа сделать это:

  1. Настройте транзакционные примеры для каждого отдельного теста.
  2. Настройте примеры транзакций для всех тестов.

Если вы выберете вариант 1: В верхней части файла спецификации после:

require 'spec_helper'

Добавлять:

RSpec.configure {|c| c.use_transactional_examples = true }

Это приведет к откату транзакций после каждого примера.

2.Если хотите настроить глобально, то в файле spec_helper.rb

RSpec.configure do |config|
...
config.use_transactional_examples = true # Add this
...
end
person Abraham    schedule 01.06.2016