2014-04-09 5 views
0

컨트롤러가 로그인 된 current_user에게 해당 작업을 사용하도록 권한을 부여하는지 확인하는 가장 간단한 방법은 명시 적으로 권한이있는 사용자가 해당 작업을 실행할 수 있고 다른 사용자는 실행할 수 없는지 확인하는 두 가지 사양을 명시 적으로 작성하는 것입니다. 예를 들면 :CanCan의 "권한을 부여하십시오!" 컨트롤러 사양의 메소드?

# 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) 확인되고 있음을 직접 테스트하지 않는 한이 큰되지 않습니다.

더 간단한 사양을 작성하고 싶습니다. 나는이 짧은 것 생각하고 직접 내가 사용하고자하는 인증 검사가 실행되고 있음을 테스트

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

(예를 사용하여 조롱 위해 'RR')를. 그러나, 나는 모의 쓰기 방법을 알아낼 수 없다. mock(controller)이 맞지 않거나 조롱하는 ApplicationController 또는 Ability이 작동하지 않는 것 같습니다.

어떻게 이런 모의 의사를 쓸 수 있습니까?

답변

0

그것은 내가 위의 기록 작동 된 방법을 밝혀 다른 .. 오타 이전에 있었해야합니다.

그래서 권한을 확인하십시오! check가 컨트롤러에서 호출되면 다음과 같이 작성하면됩니다.

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

나는 당신이 책임을 분리 할 수 ​​있도록하기 위해 ability_spec.rb와 같은 다른 스펙에서 인증을 테스트하는 것이 더 좋을 것이라고 생각합니다. 이렇게하면 다른 컨트롤러에서 사용하는 것과 동일한 인증 방법을 테스트 할 필요가 없습니다.

은을 heres 일부는 details

+0

네, 리팩토링을 시도하는 것입니다. 올바른 권한 부여를 확인하고 싶습니다! check는 컨트롤러에서 호출되며 ability_spec.rb에서만 실제 인증 로직에 대한 엄격한 테스트를 거친다. – jay

관련 문제