【问题标题】:Prevent parameter encoding in controller spec防止控制器规范中的参数编码
【发布时间】:2015-05-13 12:46:48
【问题描述】:

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

# 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 请求?

【问题讨论】:

  • 你传递了 id foo/bar不是调用路由。这不应该发生吗?
  • 我如何在控制器规范中调用路由?
  • 您是否只是想测试一下foo/bar 路由不会路由到任何地方?
  • 因为除了it "works",我不知道你的测试应该做什么
  • 是的,这就是我试图通过 failing 规范确定的内容,然后我添加路由通配符以启用包含 / 的 id 参数。

标签: ruby-on-rails-4 rspec urlencode


【解决方案1】:

您实际上要测试的似乎是/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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    相关资源
    最近更新 更多