gpt4 book ai didi

ruby-on-rails-4 - 防止 Controller 规范中的参数编码

转载 作者:行者123 更新时间:2023-12-04 06:59:02 24 4
gpt4 key购买 nike

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

# 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在请求发送到 Controller 之前是 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 的 show Action 与 "foo/bar"id范围。

在封面下,rspec-rails Controller 测试使用 ActionController::TestCase ,它提供了一个 assert_routing断言。在 rspec-rails您可以将此断言与 #route_to 一起使用期望,像这样:

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

关于ruby-on-rails-4 - 防止 Controller 规范中的参数编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30215239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com