【问题标题】:Rails "POST" member route responds to all request typesRails“POST”成员路由响应所有请求类型
【发布时间】:2012-02-24 15:33:12
【问题描述】:

我正在尝试为我的“foo”控制器设置一个成员路由,该控制器名为“bar”,这样它就应该只响应发布请求。但是,我注意到在我的 RSpec 测试中,它响应所有请求类型(GET、POST、PUT、DELETE)。

我的印象是这样定义路由会限制它,使其仅响应 POST 请求:

resources :foo do
  member do
    post 'bar'
  do
end

当我运行rake routes 时,它只显示“酒吧”路线,这似乎进一步证实了这一点:

bar_foo    POST    /foo/:id/bar(.:format)    {:action=>"bar", :controller=>"foo"}

但是,根据 RSPEC,以下测试对于 GET、PUT 和 DELETE 失败(意味着控制器成功处理请求):

describe FooController do
    describe "GET bar" do
        it "should not be successful" do
            foo = FactoryGirl.create(:foo)
            get :bar, :id => foo.id
            response.should_not be_ok
        end
    end 
end

我在这里遗漏了一些小东西吗?如何限制我的“酒吧”成员路线仅响应“发布”请求。

编辑:

这似乎是 RSpec 2.0 或 ActionController::TestCase 的一个问题,因为当我尝试使用除 POST 之外的任何东西在我的服务器上点击 /foo/:id/bar 时出现以下错误:

Routing Error

No route matches [GET] "/foo/1/bar"

【问题讨论】:

  • "puts response.inspect" 并检查输出。
  • 响应是 200,这是 FooController 成功后“bar”操作返回的值
  • 只是为了验证您的理智,我已经编写了类似的测试,依赖于拒绝非 POST 等的路由,并且已经成功了。这是正确的策略,必须是一些“平凡的细节”
  • 谢谢,知道你没疯总是好的 :)
  • 您的测试日志是否表明在get :bar 调用中实际访问的路径是什么?它是否列出了`Started GET "/foo/:id/bar" 或其他内容?另外,您的 routes.rb 底部是否有一条“包罗万象”的路线?

标签: ruby-on-rails ruby-on-rails-3 rspec routes


【解决方案1】:

根据我自己的经验,只要路由存在,RSpec 控制器测试似乎不会尝试强制执行路由行为。 RSpec 确实提供路由测试,specifically the be_routable matcher

鉴于以下route.rbsn-p:

post :foo, to: 'foo#create'

它出现了

it "won't work as expected" do
  get :foo
  expect(response).to be_ok #=> pass

  post :foo
  expect(response).to be_ok #=> pass
end

会过去的。只有当路由从route.rb 完全丢失时才会失败。

以下内容将通过并可用于执行我们感兴趣的测试:

it "responds to only the proper HTTP verbs" do
  expect(get: :foo).not_to be_routable #=> pass - Cannot GET ?‍♂️
  expect(post: :foo).to be_routable    #=> pass - POST works ?
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多