Тестирование RSpec и CanCan - PullRequest
       20

Тестирование RSpec и CanCan

2 голосов
/ 20 декабря 2010

Я использую RSpec и CanCan в проекте.Я проверяю свою логику разрешений в спецификациях, связанных с классом Ability.Что касается контроллеров, я действительно хочу убедиться, что я делаю проверку авторизации.Я установил макрос контроллера, но он, кажется, не работает правильно.

Так что на самом деле у меня есть два вопроса.Во-первых, достаточна ли стратегия для проверки логики разрешений моих контроллеров (или мне нужно больше проверять логику авторизации контроллеров)?

Во-вторых, кто-нибудь видит, что я делаю неправильно, чтобы это не сработало?

#plan_orders_controller.rb
def approve
  plan_order = PlanOrder.find(params[:id])
  authorize! :update, plan_order
  current_user.approve_plan_order(plan_order)
  redirect_to plan_order_workout_plan_url(plan_order)
end

#controller_macros.rb
def it_should_check_permissions(*actions)
  actions.each do |action|
    it "#{action} action should authorize user to do this action" do
      @plan_order = Factory(:plan_order, :id=>1)
      ability = Object.new
      ability.extend(CanCan::Ability)
      controller.stub!(:current_ability).and_return(ability)        

      get action, :id => 1
      ability.should_receive(:can?)
    end
  end    
end

Вывод, полученный из RSpec, следующий:

 Failure/Error: ability.should_receive(:can?)
 (#<Object:0x00000006d4fa20>).can?(any args)
     expected: 1 time
     received: 0 times
 # ./spec/controllers/controller_macros/controller_macros.rb:27:in `block (2 levels) in it_should_check_permissions'

Я не совсем уверен, какой метод я должен проверять при вызове! Authorize в контроллере (или он автоматически вызывается через load_and_authorize_resource)

1 Ответ

2 голосов
/ 22 мая 2011

should_receive - это ожидание того, что произойдет в будущем.Поменяйте местами эти две строки:

get action, :id => 1
ability.should_receive(:can?)

, и вы получите:

ability.should_receive(:can?)
get action, :id => 1
...