pla*_*mbo 5 rspec routes ruby-on-rails ruby-on-rails-3
我正在尝试为我的“foo”控制器设置一个成员路由,该控制器名为“bar”,这样它应该只响应发布请求。但是,我注意到在我的 RSpec 测试中它响应所有请求类型(GET、POST、PUT、DELETE)。
我的印象是,这样定义路由会限制它,使其仅响应 POST 请求:
resources :foo do
member do
post 'bar'
do
end
Run Code Online (Sandbox Code Playgroud)
rake routes当我运行它时,它仅显示“bar”路线,如下所示,这一事实似乎进一步证实了这一点:
bar_foo POST /foo/:id/bar(.:format) {:action=>"bar", :controller=>"foo"}
Run Code Online (Sandbox Code Playgroud)
然而,根据 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
Run Code Online (Sandbox Code Playgroud)
我在这里遗漏了一些小东西吗?如何限制我的“酒吧”会员路线仅响应“发布”请求。
编辑:
这似乎是 RSpec 2.0 或ActionController::TestCase的问题,因为当我尝试使用除POST 之外的任何内容在服务器上点击/foo/:id/bar时,出现以下错误:
Routing Error
No route matches [GET] "/foo/1/bar"
Run Code Online (Sandbox Code Playgroud)
根据我自己的经验,只要路由存在, RSpec 控制器测试就不会尝试强制执行路由行为。RSpec 确实提供了路由测试,特别是be_routablematcher。
鉴于以下route.rb片段:
post :foo, to: \'foo#create\'\nRun Code Online (Sandbox Code Playgroud)\n它出现
\nit "won\'t work as expected" do\n get :foo\n expect(response).to be_ok #=> pass\n\n post :foo\n expect(response).to be_ok #=> pass\nend\nRun Code Online (Sandbox Code Playgroud)\n将传递。只有当路由完全丢失时route.rb才会失败。
以下内容将通过并可用于执行我们感兴趣的测试:
\nit "responds to only the proper HTTP verbs" do\n expect(get: :foo).not_to be_routable #=> pass - Cannot GET \xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f\n expect(post: :foo).to be_routable #=> pass - POST works \nend\nRun Code Online (Sandbox Code Playgroud)\n