2010-08-11 3 views
37

특정 오류가 발생하는 모델에서 기능을 테스트하고 싶습니다. 이 기능은 다음과 같은 : Rails ActiveSupport : 오류가 발생했다고 주장하는 방법은 무엇입니까?

def merge(release_to_delete) 
    raise "Can't merge a release with itself!" if(self.id == release_to_delete.id) 
    raise "Can only merge releases by the same artist" if(self.artist != release_to_delete.artist ) 
    #actual merge code here 
end 

가 지금은 어설 션을 수행 할 것을 나는 예외가 실제로 던져지는 것으로, 그 예외의 각을 일으키는 매개 변수를 사용하여이 함수를 호출 할 때. ActiveSupport 설명서를보고 있었지만 유망한 것을 찾지 못했습니다. 어떤 아이디어?

답변

85

그래서 단위 테스트는 실제로 지원되지 않습니다. 루비는 표준 libs (루비 1.8.x의 Test :: Unit, 루비 1.9의 MiniTest)에서 전형적인 xunit 프레임 워크를 제공하며, activesupport의 내용은 약간의 내용을 추가합니다. 당신이 체크하려면

테스트 : 단위를 사용하는 경우/MiniTest

assert_raises(Exception) { whatever.merge } 

당신이 RSpec을 사용하는 경우 (불행히도 제대로 문서화,하지만 방법이 더 인기)

lambda { whatever.merge }.should raise_error 

제기 된 Exception :

exception = assert_raises(Exception) { whatever.merge } 
assert_equal("message", exception.message) 
+7

고마워요! 그래도 예외 대신 "RuntimeError"를 사용해야했습니다. assert_raise {artist1.merge (artist1)} 이 가이드는 매우 도움이되었습니다. http://guides.rubyonrails.org/testing.html – spilliton

+1

@spilliton : Ruby 인터프리터는 위의 코드를'assert_raise (Exception() {whatever.merge}) '로 취급하기 때문에, 즉 주어진 블록으로 호출되는'Exception' 메서드를 찾습니다. 괄호를 추가하면 그 모호성이 해결됩니다. (이미 답변을 고쳤습니다) –

+0

rspec 3에서'expect {whatever.merge} .to raise_error' (http://www.relishapp.com/rspec/rspec-expectations/v/3-1/docs/built- in-matcher/raise-error-matcher) –

9

도 예외가 발생하지 않습니다 (또는 성공적으로 처리)되도록 테스트 케이스 내부 수행합니다

assert_nothing_raised RuntimeError do 
     whatever.merge 
    end 

그 오류를 확인하려면 발생하여 테스트 케이스 내부에 할 ..

assert_raise RuntimeError do 
     whatever.merge 
    end 

그래 그 저것과 같이 쉬운! :)

관련 문제