轨道上的红宝石 - 如何在控制器规范中模拟CanCanCan的"authorize!"方法?



编写规范检查控制器是否授权已登录的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)不正确,嘲笑ApplicationControllerAbility似乎也不起作用。

我该如何写这种模拟?

我认为最好在另一个规范(如ability_spec.rb)中测试授权,以便将它们的职责分开。通过这样做,您将不必测试在不同控制器上使用的相同授权方法。

以下是

的其他一些详细信息

事实证明,我写上述内容的方式行之有效。。之前一定有错别字。

所以,检查一下授权!检查在控制器中被调用,您只需要写:

 it "should check the user can do_this_action" do
   mock(controller).authorize!(:some_action, some_object)
   get :some_action
 end

相关内容

  • 没有找到相关文章

最新更新