DatabaseCleaner не работает с автоматическими тестами Capybara
Я запускаю автоматизированные тесты с использованием Capybara и Poltergeist на сайте Rails, который работает на MySQL.
Я вижу, где он фиксирует вставки "данных" при запуске этого автоматизированного пакета, но DatabaseCleaner, похоже, ничего не делает, я также не получаю ошибок при его запуске.
(Я удостоверился, что драгоценные камни установлены также). Это мой первый запуск с DatabaseCleaner, но, похоже, ничего не работает.
Соответствующая часть файла rails_helper:
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, :js => true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Также я убедился config.use_transactional_fixtures = false
,
Мой файл test_helper.rb тоже ничего особенного:
#Load up Capybara/Rspec
require 'rails_helper'
require 'rspec'
require 'capybara/rspec'
require 'capybara'
require 'capybara/dsl'
#Load up Poltergeist
require 'capybara/poltergeist'
#Set JS Supported Driver
Capybara.javascript_driver = :poltergeist
И, наконец, пример сценария, который в основном проходит через локальный веб-сайт Rails и создает запись. Это просто, но я просто использую это в качестве примера. Автоматизированные тесты все делают свое дело.
require 'test_helper'
describe "Test", :type => :feature, :js => true do
it 'Add Widget' do
visit ('/')
fill_in('user_email', :with => 'test@test.com')
fill_in('user_password', :with => 'p@ssword')
click_button('Log in')
click_link('Tools')
expect(page).to have_content 'Tools'
click_link('Stuff')
expect(page).to have_content 'Stuff'
click_link('Create New Thingy')
expect(page).to have_content 'New Thingy'
fill_in('thingy_name', :with => 'Name for a Thing!')
click_button('Create Thing!')
end
end
Я что-то здесь упускаю? Я не получаю никаких ошибок при запуске, но данные просто не удаляются.
Я использую MySQL 5.6.26 и Rails 4.0.2.
2 ответа
По умолчанию database_cleaner очищает тестовую базу данных для приложения, тесты которого выполняются. Если запросы в вашей спецификации интеграции направляются в какое-то другое приложение, не работающее с этой тестовой базой данных, то оно ничего не будет делать с этой другой базой данных (она даже не знает, что она существует).
Вы можете дать очистителю базы данных дополнительные базы данных для очистки. Если ваш database.yml перечислил детали для этого другого db с ключом :integration
то есть он содержал что-то вроде
integration:
adapter: mysql
database: some_db
...
Тогда вы могли бы использовать
DatabaseCleaner[:active_record, { :connection => :integration }].strategy = :truncation
Чтобы указать, что эта база данных также должна быть обрезана при вызове DatabaseCleaner.clean
, Это, конечно, удалит все из этой базы данных при каждом запуске теста.
Совет по отладке: включите "общий журнал" в MySQL, чтобы увидеть, какие запросы выполняются. Если повезет, это даст вам представление о том, на какую часть тестового жгута смотреть.