Тестирование контроллера RSPEC и Cancan
-
11-10-2019 - |
Вопрос
Я использую Rspec и Cancan в проекте. Я тестирую свою логику разрешения в спецификациях, связанных с классом способностей. Для контроллеров я действительно просто хочу убедиться, что я делаю проверку авторизации. Я настроил макрос контроллера, но он, похоже, не работает правильно.
Так что на самом деле у меня есть два вопроса. Во -первых, достаточно ли стратегии для тестирования логики разрешений моих контроллеров (или я должен больше тестировать логику авторизации контроллера)?
Во -вторых, кто -нибудь видит, что я делаю не так, чтобы заставить это не работать?
#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'
Я не совсем уверен, какой метод я должен проверять, когда я звоню! Авторизируя в контроллере (или его автоматически называют через LOAD_AND_Authorize_Resource)
Решение
should_receive
это ожидание чего -то, что произойдет в будущем. Поверните эти две линии:
get action, :id => 1
ability.should_receive(:can?)
Итак, у вас есть это:
ability.should_receive(:can?)
get action, :id => 1