База данных не очищается после каждого интеграционного теста. Значение остается в базе данных.
Есть ли вариант, который я должен сделать, чтобы это произошло?
Спасибо
База данных не очищается после каждого интеграционного теста. Значение остается в базе данных.
Есть ли вариант, который я должен сделать, чтобы это произошло?
Спасибо
Я думаю, что https://github.com/bmabey/database_cleaner — это то, что вам нужно.
Всем, кто использует перехватчики before(:all)
, следует помнить, что эти перехватчики выполняются до открытия транзакции, связанной с фикстурой. Это означает, что любые данные, созданные перехватчиками before(:all), не будут откатываться фикстурами транзакций. Вы можете прочитать больше в документации RSpec.
Я просто хотел упомянуть об этом, потому что я был укушен этим, и моим первоначальным инстинктом было перейти к очистителю базы данных (который оказался ненужным и, в конечном итоге, не работающим).
Как подготовить тестовые базы данных для тестов Rails rspec без запуска спецификации rake?
Мой ответ может вас заинтересовать. это хорошее решение. В вашем случае вам, вероятно, понадобится что-то вроде
config.after :each do
ActiveRecord::Base.subclasses.each(&:delete_all)
end
Посмотрите здесь руководство: http://railscasts.com/episodes/257-request-specs-and-capybara
Он описывает средство очистки базы данных помимо Rspec и Capybara.
Вам нужен 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.
group.metadata[:type]
- person Clam; 02.11.2016
Есть два способа сделать это:
Если вы выберете вариант 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