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, чтобы увидеть, какие запросы выполняются. Если повезет, это даст вам представление о том, на какую часть тестового жгута смотреть.

Другие вопросы по тегам