Как очистить БД с помощью Rails 5, Minitest, Capybara JS (Selenium)?

Я создал очень простой проект rails 5, чтобы сузить мою проблему: https://github.com/benedikt-voigt/capybara_js_demo

В этом проекте мутация данных, выполненная Capybara JS, не удаляется ни Rails, ни добавленным мной средством очистки баз данных.

В следующем замечательном блоге утверждается, что DatabaseCleaner не требуется: http://brandonhilkert.com/blog/7-reasons-why-im-sticking-with-minitest-and-fixtures-in-rails, но это работает только для светильников, а не для мутация, выполненная внепоточным тестом Capybara. Я добавил средство очистки базы данных, но это тоже потребовало доработки.

У кого-нибудь есть образец установки?


person Ben    schedule 07.08.2016    source источник


Ответы (2)


Бегло взглянув на ваш тест, я бы сказал, что он оставляет данные, потому что данные фактически добавляются после очистки DatabaseCleaner. Вызов click_on происходит асинхронно, поэтому, когда происходит ваш вызов assert_no_content, нет гарантии, что приложение еще обработало запрос или страница еще не изменилась, и, поскольку на текущей странице нет текста «Имя уже занято», утверждение проходит, и база данных очищается. При этом щелчок обрабатывается приложением, и после очистки создаются новые данные. Вам нужно проверить / дождаться содержимого, которое появится на странице после клика - что-то вроде

page.assert_text('New Foo Created')

Вы должны утверждать, что контент отсутствует, только если вы уже знаете, что страница изменилась, или если вы ожидаете, что что-то исчезнет с текущей страницы.

person Thomas Walpole    schedule 07.08.2016
comment
Том, спасибо, что посмотрел на это. Я попробовал и изменил утверждение, но это не решает проблемы. Проблема по-прежнему в том, что созданные объекты не удаляются из БД. Даже после прохождения набора тестов эти данные остаются в БД. - person Ben; 08.08.2016

Теперь я решил проблему, установив соединение с БД на один

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || ConnectionPool::Wrapper.new(:size => 1) { retrieve_connection }
  end
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

как описано здесь: https://mattbrictson.com/minitest-and-rails

Я загрузил рабочее репо здесь: https://github.com/benedikt-voigt/capybara_js_demo_working

person Ben    schedule 08.08.2016