Rails 3.1:测试控制器和路由规范中的"DELETE 'destroy'"



我正在测试一个使用巫术进行身份验证的应用程序。我有一个会话控制器,它处理用户登录/签出与测试一起去的行动。我知道销毁操作通常以id作为参数,但对于签出功能来说,这是不必要的。

routes.rb

resources :sessions
# match "/signout", :to => "sessions#destroy"

sessions_controller_spec.rb

describe "DELETE 'destroy'" do
  it "should log the user out" do
    login_user(Factory(:user))
    delete :destroy
    controller.current_user.should be_nil
    controller.should_not be_signed_in
  end 
end

session_routes_spec.rb

it "should route DELETE /sessions to sessions#destroy" do
  { :delete => "/sessions" }.should route_to(
    :controller => "sessions",
    :action => "destroy"
  )
end

以上两个测试都失败了,因为路由需要一个id。有没有办法摆脱这种必要性?我知道我可以使用命名的"signout_path"路由,但我只是好奇,如果我仍然可以使用session_path,:method =>:delete而不传递它的id。

真正让我震惊的是,如果我取消注释控制器规范通过的匹配"/signout"(然而,路由规范没有)。匹配线是如何使控制器规格通过的?

尝试在config/routes.rb:

中将destroy操作映射为:session资源的collection方法。
resources :sessions, :collection => [:destroy]

默认情况下destroy是一个"成员"方法,需要指定一个资源来操作它。

最新更新