

**環境：**  
Rails: 5.1.5  
Ruby: 2.5.0  
capybara: 2.18.0  
rspec-rails: 3.7.2  
selenium-webdriver: 3.10.0

Docker初心者です。現在docker-composeで以下のように開発環境を作っており、その上でrspec(system
spec)でcapybaraのテストを行っていますが、サブドメインのテストの方法がわからなくて困っています。

docker-compose.yml

[code]

    services:
      nginx:
        image: nginx:alpine
        container_name: my_nginx
        links:
          - app
        ports:
          - "80:80"
        volumes:
          - .:/app
        depends_on:
          - chrome
    
      app:
        build:
          context: .
        command: bash -c "rm -f tmp/pids/server.pid && ./bin/webpack-dev-server & bundle exec rails s -b 0.0.0.0 -p 3000"
        working_dir: /app
        container_name: my_app
        hostname: app
        ports:
         - '3000:3000'
        expose:
          - 3000
        volumes:
          - .:/app
          - rails_public:/app/public
          - rails_log:/app/log
          - bundle:/app/vendor/bundle
          - /app/node_modules
        links:
          - postgres
          - redis
        depends_on:
          - postgres
          - chrome
        tty: true
        stdin_open: true
        environment:
          WEBPACKER_DEV_SERVER_HOST: 0.0.0.0
    
      chrome:
        container_name: my_chrome
        image: selenium/standalone-chrome
        ports:
          - 4444:4444
        volumes:
          - .:/app
    〜中略〜
    
[/code]

capybara.rb

[code]

    require "capybara/rspec"
    require "selenium-webdriver"
    
    Capybara.register_driver :selenium_remote do |app|
      capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
        chromeOptions: {
          args: ["--headless", "--no-sandbox", "--disable--gpu", "--window-size=1280x800"],
        },
        )
      Capybara::Selenium::Driver.new(app,
                                     url: "http://chrome:4444/wd/hub",
                                     browser: :remote,
                                     desired_capabilities: capabilities)
    end
    
    Capybara.run_server = false
    Capybara.default_driver = :selenium_remote
    
[/code]

spec_helper.rbを以下の用に設定するとサブドメインでないテストは正常に実行されます。

[code]

    RSpec.configure do |config|
      config.before :each, type: :system do
        driven_by :selenium_remote
        Capybara.app_host = "http://{IPSocket.getaddress(Socket.gethostname)}"
        Capybara.always_include_port = true
      end
    〜中略〜
    
[/code]

ただ、サブドメインのテストの仕方がどうしてもわかりません。  
イメージでは`/etc/hosts`にappコンテナ起動かどこかのタイミングでIPを確認しサブドメインを割り当ててそこにアクセスする感じかなと考えているのですが、docker-
compose上でextra_hostsなどを使ったりいい方法があればご教授して頂けると幸いです。よろしくお願いします。

**試したこと：**  
①`Capybara.app_host =
"http://admin.{IPSocket.getaddress(Socket.gethostname)}"`  
→IPアドレスですのでできませんでした。

②appコンテナに入り`/etc/hosts`でappコンテナのIPを`admin.app`に割当て、`Capybara.app_host =
"http://admin.app"`と設定  
→そもそも`Capybara.app_host = "http://app"`でもアクセスできず、`Capybara.app_host =
"http://app:3000"`にすると以下のエラーが出ます。  
`HTTP parse error, malformed request (): #<Puma::HttpParserError: Invalid HTTP
format, parsing fails.>`

③`Capybara.app_host = "http://nginx"`と設定  
→サブドメインでないところに接続できますが、なぜかdevelopmentのDBにアクセスしてしまいます（）

④nginxコンテナに入り`/etc/hosts`でnginxコンテナのIPを`admin.nginx`に割当て、`Capybara.app_host =
"http://admin.nginx"`と設定  
→接続できませんでした。


CC BY-SA 3.0
2018-04-11T18:52:28.990
43173
2023-06-07T06:06:20.783
13084
question
ruby-on-rails docker rspec docker-compose capybara
docker-compose+Rails5.1+rspec+HeadlessChromeでのサブドメインのテスト方法がわかりません

[code]

    Capybara.server_host = '0.0.0.0'
    
[/code]

を設定してみてはいかがでしょうか？？


CC BY-SA 4.0
2019-11-19T21:50:09.880
60669
2019-11-19T21:50:09.880
24257
43173
answer