35歳からの中二病エンジニア

社寺・鉄道・アニメを愛でるウェブ技術者の呟き

feature specで名前付きルートが使えなかった話

Rails 5.0とRSpec 3.6の環境下で、routes.rb のconstraintsでhostを限定した所、一部のfeature specが通らなくなった。

何が起こったのか

以下のようなspecが全部失敗するようになった。

feature 'hoge' do
  scenario 'fuga' do
    visit piyo_url
    expect(page).to have_content('hogera')
  end
end

ここで piyo_url をputsすると、http://www.example.com/path/to/piyoが返ってきてしまう。そのため、routes.rb でhostを絞るとルーティングのエラーになってしまうということだった。

ちなみに、デフォルトのhostは以下のように設定していて、feature spec以外では localhost:3000 が返ってくる。

Rails.application.routes.default_url_options[:host] = 'localhost:3000'
RSpec.configure do |config|
  config.include Rails.application.routes.url_helpers
end

どうやって解決したか

あまり綺麗な解決法ではないが、名前付きルートの記述を全て次のように置き換えると、localhost:3000 が返ってきた。

# visit piyo_url
visit Rails.application.routes.url_helpers.piyo_url

蛇足

今までリクエスト先が example.com で返ってくるのにspec自体は通っていたというのが気持ち悪いが、中の挙動までは追えていない…。