防止控制器规范中的参数编码
Prevent parameter encoding in controller spec
我正在尝试为包含正斜杠的参数编写(失败的)控制器规范:
# 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
被路由到 ProductsController
的显示操作,其中 "foo/bar"
作为 id
参数.
在幕后,rspec-rails
控制器测试使用 ActionController::TestCase
,它提供了 assert_routing
断言。在 rspec-rails
中,您可以将此断言与 #route_to
期望一起使用,如下所示:
expect(get: "/products/foo/bar").to route_to(controller: "products", action: "show", id: "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
被路由到 ProductsController
的显示操作,其中 "foo/bar"
作为 id
参数.
在幕后,rspec-rails
控制器测试使用 ActionController::TestCase
,它提供了 assert_routing
断言。在 rspec-rails
中,您可以将此断言与 #route_to
期望一起使用,如下所示:
expect(get: "/products/foo/bar").to route_to(controller: "products", action: "show", id: "foo/bar")