如何模仿CanCan的“授权!”控制器规范中的方法?

时间:2014-04-09 06:51:12

标签: ruby-on-rails ruby-on-rails-3 unit-testing rspec cancan

编写规范检查控制器授权登录的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似乎也无效。

我该如何编写这种模拟?

2 个答案:

答案 0 :(得分:0)

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

继承了其他details

答案 1 :(得分:0)

事实证明我在上面写作的方式......早就必须有一个错字。

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

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