コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Railsでのテストにおいて、リクエストホスト名はデフォルトだと www.example.com

どこで指定してんだろ、と思って調べてみたメモ

環境

$ bin/rails -v
Rails 5.2.2

概要

RSpecなどのテストにおいて、xxx_urlで生成されるurlのホスト名は www.example.com になる

たとえば自分のURLを生成してJSONとして返すコントローラーを作るとする

class UsersController < ApplicationController
  def index
    render json: {url: users_url}
  end
end

routes.rbはこんな感じ

Rails.application.routes.draw do
  resources :users, only: :index
end

これに対してrspecを書くと、以下のように書くとコケる

require 'rails_helper'

RSpec.describe "/users/", type: :request do
  subject { get users_path}
  context "正しくアクセスしたとき" do

    before do
      subject
    end

    it "期待した結果が返ってくる" do
      url = JSON.parse(response.body)["url"]
      expect(url).to eq("http://hoge.com/users")
    end
  end
end

このrspecを実行すると、以下のように結果が返ってきてドメイン名が固定で割り振られていることがわかる。

$ bundle exec rspec spec/request/user_spec.rb 
F

Failures:

  1) /users/ 正しくアクセスしたとき 期待した結果が返ってくる
     Failure/Error: expect(url).to eq("http://hoge.com/users")
     
       expected: "http://hoge.com/users"
            got: "http://www.example.com/users"
     
       (compared using ==)
     # ./spec/request/user_spec.rb:13:in `block (3 levels) in <top (required)>'

Finished in 0.07468 seconds (files took 2.93 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/request/user_spec.rb:11 # /users/ 正しくアクセスしたとき 期待した結果が返ってくる

結果にもあるように何も指定しないと www.example.com になる

どこでやっているのか

rails/actionpack/lib/action_dispatch/testing/integration.rb でテストのセッションの設定をしておりここらへんでやっている模様

    class Session
      DEFAULT_HOST = "www.example.com"

参考リンク