编写规范检查控制器是否授权已登录的current_user使用所述操作的最简单方法是显式编写两个规范检查具有权限的用户可以运行该操作,而另一个用户不能。例如:
# The controller action:
def some_action
authorize! :do_this_action, @some_object
end
# The spec:
it "should work when authorized" do
sign_in @user
get :some_action
response.should be_success
end
it "should not work when not authorized" do
sign_in @other_user
get :some_action
response.should_not be_success
end
但这并不好,因为它需要大量的代码(两个或多个规范),而且实际上并没有直接测试是否正在检查授权(示例中为do_this_action
)。
我希望能够编写一个更简单的规范,例如(一个使用"rr"进行嘲讽的例子)
it "should check the user can do_this_action" do
mock(controller).authorize!(:do_this_action, some_object)
get :some_action
end
我认为这会更短,并直接测试我想要使用的授权检查是否正在运行。但是,我不知道如何写模拟。mock(controller)
不正确,嘲笑ApplicationController
或Ability
似乎也不起作用。
我该如何写这种模拟?
我认为最好在另一个规范(如ability_spec.rb)中测试授权,以便将它们的职责分开。通过这样做,您将不必测试在不同控制器上使用的相同授权方法。
以下是
事实证明,我写上述内容的方式行之有效。。之前一定有错别字。
所以,检查一下授权!检查在控制器中被调用,您只需要写:
it "should check the user can do_this_action" do
mock(controller).authorize!(:some_action, some_object)
get :some_action
end