Capybara + Selemium: как инициализировать базу данных в коде интеграционного теста и сделать его видимым в приложении Rails - PullRequest
13 голосов
/ 25 марта 2011

Конфигурация: Интеграционные тесты для проекта Rails с использованием RSpec, Capybara, драйвера Selemium, базы данных SQLite.

Ситуация: У меня было несколько интеграционных тестов с Capybara и по умолчаниюстоечный драйвер.Они создают регистрацию пользователя (для Devise Gem) непосредственно в базе данных.Затем они входят в систему и тестируют сценарий, используя Capybara DSL, как это делал бы пользователь.

Проблема: Я попытался изменить драйвер на Selenium, чтобы также протестировать код JavaScript.Теперь тесты не пройдены, потому что приложение не видит регистрацию пользователя, созданную тестами.

Расследование: Похоже, что драйвер Selenium по-разному работает с переходами, поэтому изменения, внесенные в тест, невидимы ввеб-приложение.Возможное решение включает в себя:

config.use_transactional_fixtures = false 
DatabaseCleaner.strategy = :truncation

1 Ответ

14 голосов
/ 25 марта 2011

Для меня сработало решение из здесь и здесь :

  • добавить в Gemfile gem database_cleaner
  • создать файл spec/support/javascript.rbс содержимым

`

RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with :truncation
  end

  config.before(:each) do
    if example.metadata[:js]
      Capybara.current_driver = :selenium
      DatabaseCleaner.strategy = :truncation
    else
      DatabaseCleaner.strategy = :transaction
      DatabaseCleaner.start
    end
  end

  config.after(:each) do
    Capybara.use_default_driver if example.metadata[:js]
    DatabaseCleaner.clean
  end
end

`

, хотя это привело к небольшому штрафу за время выполнения спецификаций контроллера и модели (от 40 до 43 секунд).

...