Исходя из Rails 3 и никогда не использовавшей Capybara / Selenium, я сейчас запускаю приложение на Rails 5 в докере и хочу использовать «обновленный» способ написания тестов, то есть использовать спецификации системы, запроса и модели, а не спецификации контроллера.Я добавил еще один экземпляр докера, работающий с тем же образом с Guard, чтобы запускать соответствующие тесты, когда что-то менялось.И поскольку системным тестам RSpecs требуется Selenium, я запускаю официальный selenium/standalone-chrome
образ для докера.Кажется, все подключено идеально, однако системные тесты не пройдены, потому что кажется, что Selenium пытается использовать SSL.Почему это так, если я четко просил использовать http?Можно ли как-то это отключить?
Я использую docker-compose, чтобы все заработало, и важными частями docker-compose.yml
являются:
version: '3.5'
services:
app:
build: .
volumes:
- .:/srv/mldb
ports:
- "3000:3000"
depends_on:
- db
command: bundle exec rails s -p 3000 -b '0.0.0.0'
tty: true
guard:
build: .
volumes:
- .:/srv/mldb
depends_on:
- app
- chrome
command: bundle exec guard --no-bundler-warning --no-interactions
tty: true
chrome:
image: selenium/standalone-chrome
volumes:
- /dev/shm:/dev/shm
ports:
- "4444:4444"
ИВот все соответствующие строки из spec/rails_helper.rb
, которые я использую для настройки Capybara и Selenium:
selenium_url = "http://chrome:4444/wd/hub"
Capybara.register_driver :selenium_remote do |app|
Capybara::Selenium::Driver.new(
app,
browser: :remote,
url: selenium_url,
desired_capabilities: :chrome)
end
RSpec.configure do |config|
config.before(:each, type: :system, js: true) do
driven_by :selenium_remote
host! "http://app:3000"
end
end
Ошибки, которые я получаю при выполнении примера теста, который просто пытается заполнить поле ввода инажмите кнопку подтверждения.
Из контейнера Guard, в котором запущена системная спецификация:
1) Movie management given correct input values allows user to create movie
Capybara::ElementNotFound:
Unable to find button "New Movie"
Из контейнера приложения, в котором запущены рельсы:
2019-04-06 16:28:22 +0000: HTTP parse error, malformed request (): #<Puma::HttpParserError: Invalid HTTP format, parsing fails.>
Содержимое журнала-file:
(0.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
(0.2ms) BEGIN
(0.2ms) ROLLBACK
И снимок экрана, который делает Capybara:
Ошибка
Все остальные тесты (спецификации запроса и модели) работают отлично итестирование всего вручную работает также отлично.
Вот системная спецификация, которая не работает:
require 'rails_helper'
RSpec.describe "Movie management", type: :system, js: true do
context "given correct input values" do
it "enables users to create movies" do
visit "/movies"
expect(page).to_not have_text("Hellboy")
click_button "New Movie"
fill_in "Titel", with: "Hellboy"
fill_in "Jahr", with: "2004"
click_button "Film anlegen"
expect(page).to have_current_path("/movies")
expect(page).to have_text("Film erfolgreich angelegt.")
expect(page).to have_text("Hellboy")
expect(page).to have_text("2004")
end
end
end