【发布时间】: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