Rails Minitest с капибарой, как заставить assert_select «кнопка», «метка» работать правильно?

#ruby-on-rails #capybara #minitest

Вопрос:

В тесте интеграции (без поддержки капибары) ЭТО утверждение работает:

 assert_select "button", "Update"
 

для страницы, содержащей:

... <button name="button" type="submit" class="btn btn-primary">Update Account</button> ...

Мне нужна капибара для некоторых тестов на интеграцию.

Как выполнить то же утверждение (например, просто утверждать, что есть кнопка с обновлением текста), когда включены утверждения Capybara::Minitest::?

Я добавил Капибару в test_helper.rb, как показано ниже; теперь то же самое утверждение теперь выдает эту ошибку:

 TypeError: no implicit conversion of String into Hash
 

Если я изменю формат утверждения на:

 assert_select "button", text: "Update Account" 
 

теперь это бросает эту неудачу:

 expected to find select box "button" that is not disabled but there were no matches
 

Если я изменю формат утверждения на:

 assert_selector "button", text: "Update Account"
 

теперь это бросает эту неудачу:

 expected to find css "button" but there were no matches
 
 # test_helper.rb
require 'capybara/rails'
require 'capybara/minitest'

class ActionDispatch::IntegrationTest
  include Devise::Test::IntegrationHelpers
  include FactoryBot::Syntax::Methods
  # Make the Capybara DSL available in all integration tests
  include Capybara::DSL
  include Capybara::Minitest::Assertions  #### THIS LINE changes minitest assert_select #####

  # Reset sessions and driver between tests
  teardown do
    Capybara.reset_sessions!
    Capybara.use_default_driver
  end
end
 

Комментарии:

1. Не смешивайте капибару с ActionDispatch::IntegrationTest . Вы хотите иметь быстрый и легкий тестовый класс для «чистых» интеграционных тестов и отдельный класс для тестирования взаимодействия с пользователем. Если вы используете Rails 5.17 , у вас есть ActionDispatch::SystemTestCase, который делает именно это. Вы даже можете создавать системные тесты . Если вы застряли на более старой версии, создайте подкласс ActionDispatch::IntegrationTest , на котором вы основываете свои системные тесты.

Ответ №1:

Ты хочешь

 assert_selector :button, "Update Account"
 

НО вам также нужно использовать методы Капибары для управления сеансами и visit т. Д.-Капибара не использует ответы get и post т. Д. из интеграционных тестов.