Ruby on rails 4 防止控制器规范中的参数编码

Ruby on rails 4 防止控制器规范中的参数编码,ruby-on-rails-4,rspec,urlencode,Ruby On Rails 4,Rspec,Urlencode,我正在尝试为包含正斜杠的参数编写(失败的)控制器规范: # products_controller_spec.rb it "accepts parameters with a forward slash" do get :show, id: 'foo/bar' expect(response).to be_success expect(response).to render_template('show') end 这应该会失败,因为“/products/foo/bar”没有匹配

我正在尝试为包含正斜杠的参数编写(失败的)控制器规范:

# products_controller_spec.rb 
it "accepts parameters with a forward slash" do
  get :show, id: 'foo/bar'
  expect(response).to be_success
  expect(response).to render_template('show')
end
这应该会失败,因为“/products/foo/bar”没有匹配的路由:

# routes.rb
resources :products, only: [:index, :show]
但是,它会通过,因为参数
foo/bar
在请求发送到控制器之前是URL编码的:

# products_controller.rb
def show
  Rails.logger.debug(request.env['PATH_INFO'])
end
test.log中生成此值:

I, [2015-05-13T13:33:16.410943 #12962]  INFO -- : Processing by ProductsController#show as HTML
I, [2015-05-13T13:33:16.411029 #12962]  INFO -- :   Parameters: {"id"=>"foo/bar"}
...
D, [2015-05-13T13:33:16.412717 #12962] DEBUG -- : /products/foo%2Fbar/
I, [2015-05-13T13:33:16.413885 #12962]  INFO -- : Completed 200 OK in 3ms (Views: 0.9ms | ActiveRecord: 0.2ms)

注意原始请求中的URL编码为
%2F
,而不是
/
。除了删除请求对象之外,我如何才能发出rspec
get
请求,而不让它为我编码请求参数?

您实际要测试的似乎是,
/products/foo/bar
被路由到
产品控制器的show动作,使用
foo/bar
作为
id
参数

在封面下,
rspec-rails
控制器测试使用
ActionController::TestCase
,它提供了一个
assert\u路由
断言。在
rspec-rails
中,您可以预期使用此断言,如下所示:

expect(get: "/products/foo/bar").to route_to(controller: "products", action: "show", id: "foo/bar")

您正在传递id
foo/bar
,而不是调用路由。这不是应该发生的吗?我如何在控制器规范中调用路由?你只是想测试路由
foo/bar
不会在任何地方路由吗?因为我不知道你的测试应该做什么,除了
它“工作”
是的,这是我试图通过失败的规范来确定的,在添加route globbing以启用包含
/
的id参数之前。