2014-07-23 4 views
1

비 대한 컨트롤러 테스트를 발생 슈퍼 관리자 만 인덱스에 액세스 할 수 있는지 확인하기위한 네 가지 테스트. 이것을 테스트하는 더 좋은 방법이 있습니까? 다른 누구도 이런 종류의 일을 스스로 찾지 못했습니까? 난 레일 애플 리케이션을 만들 때마다 그것으로 실행됩니다.권한 부여 난 단지 슈퍼 관리자가 특정 작업에 액세스 할 수 있도록 필터를 가지고

+0

내 경험에 비추어 볼 때, 테스트는 항상 이렇게 "부풀어 오릅니다". 간단한 코드를 위해서조차도 검사해야 할 많은 수의 순열이 있습니다. – jkeuhlen

답변

0

당신은 예

shared_example "allow super admins" do |actions| 
    actions.each do |action| 
    it "should let super admin access #{action}" do 
     login_super_admin 
     get action.to_sym 
     assert_response :success 
    end 
    end 
end 

shared example "deny non super admins" do |actions, users| 
    actions.each do |action| 
    users.each do |user| 
     it "should let not let #{user} access #{action}" do 
     send("login_#{user}") 
     get action.to_sym 
     assert_response :redirect 
     end 
    end 
    end 
end 

및 권한 부여 점검이 필요하여 테스트에서 공유 만들 수 있습니다, 당신은

it_behaves_like "allow super admins", ["index"] 
it behaves_like "deny non super admins", ["index"], ["normal_admin", "user", "guest"] 

PS 작업을 수행 할 수 있습니다 :이 테스트하지 않았습니다.

# Gemfile 
gem 'shoulda-context' 

# In test_helper.rb 
class ActiveSupport::TestCase  
    def make_sure_authorization_kicks_in 
    assert_redirected_to root_url 
    assert_equal "You are not authorized to perform this action.", flash[:error] 
    end 
end 

# In controller tests 
context "NOT Super Admin" do  
    # saves a lot of typing 
    teardown { make_sure_pundit_kicks_in } 

    context "just NORMAL ADMIN" do 
    setup { login_normal_admin } 
    should("NOT get index"){ get :index }   
    should("NOT get new"){ get :new } 
    end 

    context "just normal USER" do 
    setup { login_user } 
    should("NOT get index"){ get :index }   
    should("NOT get new"){ get :new } 
    end 
end 

이 훨씬 쉽게 관리 할 수 ​​있습니다 :이 아이디어 당신에게

+0

하, 고마워, 나는 test-unit에있다. - 당신의 코드는 Rspec 용이다.) - 나는 shoulda-context를 사용하기로 결정했고 여분의 테스트를 받아 들인다. – stephenmurdoch