7

의 사용은 나는 운동이 제공하는 각 기능에 대한 단위 테스트를 작성하도록 요청 Exercise 49 of Learn Ruby the Hard Way적절한 Assert_Raise 단위 테스트 및 예외 클래스

작업입니다. 적절한 예외가 발생하면 테스트 할 항목 중 하나입니다. 이를 위해 assert_raise을 사용하는 것이 좋습니다. 여기

내가 테스트입니다 코드입니다 :

class ParserError < Exception 

end 

Pair = Struct.new(:token, :word) 

def peek(word_list) 
    begin 
     word_list.first.token 
    rescue 
     nil 
    end 
end 

def match(word_list, expecting) 
    word = word_list.shift 
    if word.token == expecting 
     word 
    else 
     nil 
    end 
end 

def skip_word(word_list, token) 
    while peek(word_list) == token 
     match(word_list, token) 
    end 
end 

def parse_verb(word_list) 
    skip_word(word_list, :stop) 

    if peek(word_list) == :verb 
     return match(word_list, :verb) 
    else 
     raise ParserError.new("Expected a verb next.") 
    end 
end 

그리고 여기에 기능 parse_verb를 들어, 테스트입니다 : 내가 테스트를 실행하면 여기에 실패하고

def test_parse_verb 
    list_one = [Pair.new(:verb, 'go'), Pair.new(:noun, 'king')] 
    assert_equal(parse_verb(list_one), Pair.new(:verb, 'go')) 

    list_two = [Pair.new(:noun, 'player') ,Pair.new(:verb, 'go'), Pair.new(:noun, 'king')] 
    assert_raise(ParserError.new("Expected a verb next.")) {parse_verb(list_two)} 
end 

는 메시지입니다 내가 얻을 :

assert_raise 기능에 대한 이해를 바탕으로
Larson-2:test larson$ ruby test_sentence.rb 
Loaded suite test_sentence 
Started 
.F.. 
Finished in 0.001204 seconds. 

    1) Failure: 
test_parse_verb(SentenceTests) [test_sentence.rb:36]: 
[#<ParserError: Expected a noun or direction next.>] exception expected, not 
Class: <ParserError> 
Message: <"Expected a verb next."> 
---Backtrace--- 
/Users/larson/Ruby/projects/ex48/lib/sentence.rb:45:in `parse_verb' 
test_sentence.rb:36:in `block in test_parse_verb' 
--------------- 

4 tests, 7 assertions, 1 failures, 0 errors, 0 skips 

Test run options: --seed 40627 

,이 시험을 통과해야한다, 내가 사용하는 방식에 문제가 있습니까? 누군가가 내가 함께 일하고있는 모든 파일의 전체 소스 코드를 원하는 경우

here

답변

28

assert_raise 오히려 필요한 예외의 인스턴스보다, 하나 개 이상의 예외 클래스의 매개 변수로 기대하고 사용할 수 있습니다.

또한 예외가 발생 했으므로 메시지 (또는 다른 속성)를 지정하려면 별도로 설정할 수 있습니다. 그래서 교체하려고 :

assert_raise(ParserError.new("Expected a verb next.")) {parse_verb(list_two)} 

로 : 어떤 이유

exception = assert_raise(ParserError) {parse_verb(list_two)} 
assert_equal("Expected a noun or direction next.", exception.message) 
+0

감사합니다! 그건 내 문제를 해결. –

2

, 나를 위해 작동하지 않았다 위의 대답을 (내가 루비 2.0.0를 사용하고 있습니다).

나는 그것이 작동하는 문자열에 오류 클래스 이름을 바꿈이 있습니다 도움을

assert_raise("RuntimeError") { 
    # some code to trigger the error 
}