Требуется ли DatabaseCleaner по спецификации системы Rails?
Из всего, что я читал о спецификациях новой системы Rails 5.1, я понял, что Rails теперь обрабатывает транзакции базы данных внутренне.
Из блога Rspec: "[ранее] ваши тесты и тестируемый код не могли совместно использовать транзакцию базы данных, и поэтому вы не можете использовать встроенный механизм RSpec для отката изменений в базе данных, вместо этого требуется очиститель базы данных, похожий на самоцвет. В системных тестах Rails Команда проделала большую работу, чтобы убедиться, что это не так, и поэтому вы можете безопасно использовать механизм RSpec, не требуя дополнительного драгоценного камня ".
Мой опыт отличается:
- Все мои тесты Rspec проходили после обновления до Rails 5.1.
- Я переименовал спецификации "feature" в "system". Все тесты пройдены.
- Я удалил гем 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. Вот краткое изложение необходимых вам шагов:
- Удалите драгоценный камень
capybara-selenium
и драгоценный камень database_cleaner
- Добавить
selenium-webdriver
- Убедитесь, что вы используете Rails 5.1.5 или новее. Более ранние версии Rails 5.1 имели дефект в ActionDispatch :: SystemTesting :: Server, который вызывал проблемы (исправлено здесь).
- В вашем
rails_helper
файл установите config.use_transactional_fixtures = true
- Если вы используете Devise для аутентификации, в файле rails_helper установите
config.include Devise::Test::IntegrationHelpers, type: :system
- Настройте файл
basic_configure
согласно этому посту Ноэля Раппина. - Замените
RSpec.feature
повсюду на RSpec.describe
.
Смотрите этот коммит для более подробной информации о том, как я управлял коммутатором. Это было хлопотно, но, надеюсь, теперь стало проще, так как 5.1.5 исправила проблему ActionDispatch :: SystemTesting :: Server (мне пришлось обезьянить патч файла в 5.1.4, но сейчас вам это не нужно).