Требуется ли DatabaseCleaner по спецификации системы Rails?

Из всего, что я читал о спецификациях новой системы Rails 5.1, я понял, что Rails теперь обрабатывает транзакции базы данных внутренне.

Из блога Rspec: "[ранее] ваши тесты и тестируемый код не могли совместно использовать транзакцию базы данных, и поэтому вы не можете использовать встроенный механизм RSpec для отката изменений в базе данных, вместо этого требуется очиститель базы данных, похожий на самоцвет. В системных тестах Rails Команда проделала большую работу, чтобы убедиться, что это не так, и поэтому вы можете безопасно использовать механизм RSpec, не требуя дополнительного драгоценного камня ".

Мой опыт отличается:

  1. Все мои тесты Rspec проходили после обновления до Rails 5.1.
  2. Я переименовал спецификации "feature" в "system". Все тесты пройдены.
  3. Я удалил гем Database Cleaner и удалил все ссылки из rails_helper.rb. Тесты JS теперь не проходят из-за ошибок validates uniqueness. Тесты не JS проходят.

Мои тесты очень просты.

let(:subject) { page }
let(:user) { create :user, name: "TestUser" }
it "displays the user page", :js do
  visit user_path(user)
  it is_expected.to have_content "TestUser"
end

При отключенном очистителе базы данных и :js => true я получаю user named TestUser already exists. С :js => false тест проходит.

Какова текущая ситуация с системными тестами и rspec? Rails обрабатывает транзакции базы данных внутренне, или все еще требуется очиститель базы данных? Кто-нибудь сталкивался с этим или может указать мне на соответствующую информацию?

Ответ 1

Вам не нужен гем DatabaseCleaner. Вот краткое изложение необходимых вам шагов:

  1. Удалите драгоценный камень capybara-selenium и драгоценный камень database_cleaner
  2. Добавить selenium-webdriver
  3. Убедитесь, что вы используете Rails 5.1.5 или новее. Более ранние версии Rails 5.1 имели дефект в ActionDispatch :: SystemTesting :: Server, который вызывал проблемы (исправлено здесь).
  4. В вашем rails_helper файл установите config.use_transactional_fixtures = true
  5. Если вы используете Devise для аутентификации, в файле rails_helper установите config.include Devise::Test::IntegrationHelpers, type: :system
  6. Настройте файл basic_configure согласно этому посту Ноэля Раппина.
  7. Замените RSpec.feature повсюду на RSpec.describe.

Смотрите этот коммит для более подробной информации о том, как я управлял коммутатором. Это было хлопотно, но, надеюсь, теперь стало проще, так как 5.1.5 исправила проблему ActionDispatch :: SystemTesting :: Server (мне пришлось обезьянить патч файла в 5.1.4, но сейчас вам это не нужно).