問題
Rails::Engineをmountして、そのルートへのリクエストのcontroller specを書きたい場合、
get :index
みたいにやるとNo route matches
と言われてしまう。
そのため、毎度
get :index, use_route: :my_engine
みたいに書かないといけないのだけれど、これが死ぬほどめんどくさい。
解決策
Rails3.2Engineのコントローラーのspecについて のように、
get, post, put, deleteをしたときにActionController::TestCase::Behavior.process
に渡されるパラメータにuse_route: :my_engine
を含めてやればよい。
rails4だとpatchもあるわけで、process自体をオーバーライドしてしまったほうがシンプルに書けるし良いと思われる。
processの定義はここなんだけど、今はメソッドのシグネチャが違う気がする。
以上を鑑みて、以下のようにspec_helperをいじるなりspecのsupportファイルを書く。
module ControllerSpecHelper
def process(action, http_method = 'GET', *args)
parameters, session, flash = args
super(action, http_method, (parameters || {}).merge(use_route: :my_engine), session, flash)
end
end
RSpec.configure do |config|
config.include ControllerSpecHelper, type: :controller
end