Ruby
RSpec
RubyOnRails

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

Rails 5.0とRSpec 3.6の環境下で、routes.rbconstraintshostを限定した所、一部の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.rbhostを絞るとルーティングのエラーになってしまうということだった。

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

config/environments/test.rb
Rails.application.routes.default_url_options[:host] = 'localhost:3000'
spec/spec_helper.rb
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自体は通っていたというのが気持ち悪いが、中の挙動までは追えていない…。