Dockerized rails rspec системные тесты не подключаются - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь настроить приложение Rails с помощью Docker.У меня проблемы с системными тестами, которые я пытаюсь запустить в контейнере Docker.

Я установил контейнер Selenium, который пытается открыть веб-сайт на http://0.0.0.0:3005, но не может подключиться.Я хочу, чтобы Capybara подключился к удаленному серверу, изменив IP-адрес, к которому он должен подключиться, но это не удалось.

Вот мой составной файл Docker:

# docker-compose.yml
version: '3'

services:
  postgres:
    image: postgres:10.3-alpine
    volumes:
      - ./tmp/db:/var/lib/postgresql/data

  redis:
    image: redis:4.0.5-alpine
    command: redis-server
    hostname: redis
    volumes:
      - ./tmp/redis:/var/lib/redis/data

  app:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    hostname: bumblebee-web
    depends_on:
      - postgres
      - redis
    ports: 
      - 3000:3000
    volumes:
      - .:/app
    environment:
      - RAILS_LOG_TO_STDOUT=true
    tty: true

  sidekiq:
    depends_on:
      - postgres
      - redis
    build: .
    command: bundle exec sidekiq -C config/sidekiq.yml
    volumes:
      - .:/app

  # Test containers
  test:
    build: .
    env_file:
      - .env.test
    ports:
      - 3005:3005 # Capybara listens here
    links:
      - postgres
      - selenium
    volumes:
      - .:/app
    command: bin/spring server
    environment:
      TEST_APP_HOST: test
      TEST_APP_PORT: 3005
      SELENIUM_HOST: selenium
      RAILS_ENV: test
      DOCKER: 'true'
    networks:
      default:
        aliases:
          - test

  selenium:
    image: selenium/standalone-chrome-debug
    ports: 
      - 4444:4444 
      - 5900:5900
    logging:
      driver: none

Это моя вспомогательная конфигурация RSpec Rails

# rails_helper.rb
RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
  config.include Devise::Test::ControllerHelpers, type: :controller

  config.before(:each, type: :system, js: true) do
    if YAML.safe_load(ENV["DOCKER"])
      driven_by :selenium_remote
      host! "http://#{Capybara.server_host}:#{Capybara.server_port}"
    else
      driven_by :headless_chrome
    end
  end
end

if YAML.safe_load(ENV["DOCKER"])
  selenium_url = "http://selenium:4444/wd/hub"

  Capybara.register_driver :selenium_remote do |app|
    Capybara::Selenium::Driver.new(
      app,
      url: selenium_url, 
      browser: :remote, 
      desired_capabilities: :chrome
    )
  end

  Capybara.run_server = false
  Capybara.server_host = ENV['TEST_APP_HOST']
  Capybara.server_port = ENV['TEST_APP_PORT']
  Capybara.app_host = "http://#{Capybara.server_host}:#{Capybara.server_port}"
else
  Capybara.register_driver(:headless_chrome) do |app|
    capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
      chromeOptions: { args: %w[headless disable-gpu window-size=1920,1080] }
    )

    Capybara::Selenium::Driver.new(
      app,
      browser: :chrome,
      desired_capabilities: capabilities,
    )
  end

  Capybara.javascript_driver = :headless_chrome
end

Я подключился с VNC к контейнеру селена и сделалскриншот страницы, которую он открывает.Я приложил снимок экрана.

Я попытался получить IP-адрес тестового контейнера и ввести его вручную, но, похоже, ничего не помогло.

Чтобы быть уверенным, что я дал все, что яиспользуйте для запуска теста вот команда, которую я использую:

docker-compose run test bin/rspec spec/feature/compositions/composition_multi_delete_spec.rb

И тестовый файл RSpec:

# spec/feature/compositions/composition_multi_delete_spec.rb
require 'rails_helper'

include Warden::Test::Helpers

feature "Multi delete of compositions" do
  let(:group) { FactoryBot.create :private_group }
  let(:user) { FactoryBot.create :user }
  let(:composition) { FactoryBot.create :composition, :filled, user: user, group: group }

  before do
    composition
    login_as user, scope: :user
  end

  scenario "is expected to work and remove the composition", type: :system, js: true do
    composition
    visit compositions_path
    click_on "Edit compositions"
    find("#composition-#{composition.id}").click
    click_on "Delete items"
    page.driver.browser.switch_to.alert.accept

    expect(page).to_not have_content composition.name
    visit compositions_path
    expect(page).to_not have_content composition.name
  end

  scenario "is expected to preserve the search scope after delete", type: :system, js: true do
    visit compositions_path scope: "all"
    click_on "Edit compositions"
    find("#composition-#{composition.id}").click
    click_on "Delete items"
    page.driver.browser.switch_to.alert.accept
    # because of DB deadlock issue added sleep
    sleep 0.2

    expect(page).to have_current_path '/compositions?scope=all'
  end
end

Любая помощь или совет приветствуются!

enter image description here

...