2009-07-16 2 views
3

레일 프로그래밍 프로그래밍에서 매우 유용한 한 가지 트릭은 즉석에서 메서드를 만드는 데 class_eval을 사용할 수 있다는 것입니다. 지금 테스트를 시작하고 비슷한 아이디어가 테스트를 생성하는 데 사용될 수 있는지 궁금합니다.레일에서 테스트를 동적으로 생성하는 것이 가능합니까?

예를 들어, 컨트롤러에있는 모든 작업에 대해 사용자가 로그인해야하는 경우를 말하자면 저는 before_filter입니다. before_filter이 모든 작업에 적용되도록하는 테스트를 작성하고 싶습니다. 개별적으로 각 테스트를 작성하는 대신 이러한 테스트를 자동으로 생성하고 싶습니다.

이 유형의 테스트가 권장 할 만합니까? 아니면 테스트를 개별적으로 작성해야합니까? 그렇다면 어떻게 그렇게 할 것입니까?

편집 : 그것은 한 번만 실행 얻을 수 있도록 내가 이와 같은 코드 블록을 넣어 것입니다 지금은 사람들이 유용 할 수 확인했다고

actions = {:index => :get,:show => :get,:edit => :get,:update => :put} 
actions.each_pair do |action,type| 
    class_eval(%Q{def test_user_required_for_#{action} 
     set_active_user users(:one) 
     #{type} :#{action} 
     assert flash[:error] 
     assert_redirected_to :action => :index 
    end 
    }) 
end 

,이 같은 것을 보일 수 있습니다 이 테스트를 만들까요?

+1

'class_eval'의 문자열 형식을 사용하지 마십시오. class_eval (반드시 필요하지는 않음)을 사용해야하는 경우 블록 양식을 사용하십시오. 더 안전합니다. –

답변

3

DRY 원칙은 애플리케이션 코드에 적용되는만큼 테스트 코드에도 적용됩니다.

모든 테스트를 생성하는 한 가지 방법을 사용하면 처음부터 테스트가 올바른지 쉽게 확인해야합니다.

댓글에 응답하려면 (참고 : 나는 레일스 테스트 코드를 잠시 쓰지 않았으므로 아마 100 % 정확하지 않을 것입니다). %| | 사이의 모든 것은 하나의 큰 문자열입니다.

MyControllerTest 

    [:index, :show, :new, :create, :edit, :update, :destroy].each do |action| 
     class_eval do %| 
     test "#{action} requires before filter" do 
      #test #{action} code here 
     end 
     | 
    end 

end 
+0

어떻게하면이 테스트를 만드는 방법과 위치는? –

+0

어디에서이 코드를 작성하여이 테스트를 설정하기 위해 한 번만 실행되도록 할 수 있습니까? –

+0

이것은 테스트하려는 컨트롤러에 속합니다. 예를 들어, AccountsController가 잠겨 있는지 확인하려면 코드가 accounts_controller_test.rb 파일에 저장됩니다. – erik

0

일반적으로 테스트를 개별적으로 작성하십시오. 그러나 동일한 테스트가 여러 개있는 경우 사용자가 가지고있는 블록과 같이 each 블록에서 각각 하나씩 생성하는 데 아무런 문제가 없습니다.

보너스 팁 : Test :: Unit이 아닌 RSpec을 사용하십시오. 일반적으로 더 멋지게 할뿐만 아니라 훨씬 쉽게 작업 할 수 있습니다.

+0

rspec 대 test-unit의 사용 용이성은 개인적인 취향의 문제입니다. 나는 개인적으로 test :: unit (+ shoulda)가 훨씬 쉽고 더 자연 스럽다고 생각한다. 이것은 YMMV 주제입니다. –

+0

@TarynEast 더 이상이게 맛의 문제라고 더 이상 믿지 않습니다 : RSpec의'should' 문법은 행동에 대해 생각하도록 장려하는 반면, Test :: Unit의'assert' 구문은 구현에 대해 생각하도록 장려합니다 .일반적으로 구현이 아닌 행동은 테스트해야하는 것입니다. 왜냐하면 우리는 * 인터페이스 *가 의도 한대로 작동하는지 확인하는 데에만 관심이 있기 때문입니다. Test :: Unit이 더 자연 스럽다는 것을 알게된다면, 아마도 구현을 테스트하려는 것입니다. 즉, 잘못된 것을 테스트하려고합니다. –

+0

@TarynEast 방금 읽은 것과 Shoulda를 사용하고 있음을 알았으므로'should' 구문을 사용합니다. 왜 RSpec을 사용하지 않는가? Shoulda에 대해 더 좋아하는 점은 무엇입니까? –

관련 문제