Мне удалось обойти это с помощью следующего патча:
module RSpec::Rails
module ControllerExampleGroup
module ClassMethods
def controller(base_class = nil, &body)
base_class ||= RSpec.configuration.infer_base_class_for_anonymous_controllers? ?
controller_class :
ApplicationController
metadata[:example_group][:described_class] = Class.new(base_class) do
def self.name; "AnonymousController"; end
end
metadata[:example_group][:described_class].class_eval(&body)
######## PATCH START ########
custom_routes = @custom_routes # Copy over routes to local variable so it will be accessible
before do
@orig_routes, @routes = @routes, ActionDispatch::Routing::RouteSet.new
if custom_routes # if this was set then pass that to the draw function
@routes.draw &custom_routes
else
@routes.draw { resources :anonymous } # else do what it used to do before
end
######### PATCH END #########
routes = @routes
described_class.send(:define_method, :_routes) { routes }
end
after do
@routes, @orig_routes = @orig_routes, nil
end
end
######## PATCH START ########
def custom_routes &block
@custom_routes = block
end
######### PATCH END #########
end
end
end
Требуется этот файл в вашем spec_helper, а затем в вашем тесте просто выполните:
describe ApplicationController do
describe 'respond_with_foo' do
custom_routes do
get :bar, controller: :anonymous, action: :bar
end
controller do
def index
respond_with_foo
end
end
it 'should respond with foo' do
get :index
response.should be_foo
end
end
end
На случай, если кто-нибудь спросит, я протестировал этот код с установленным в false значением infer_base_class_for_anonymous_controllers.