我正在测试一个使用巫术进行身份验证的应用程序。我有一个会话控制器,它处理用户登录/签出与测试一起去的行动。我知道销毁操作通常以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是一个"成员"方法,需要指定一个资源来操作它。