7

pracuję nad Exercise 49 of Learn Ruby the Hard WayWłaściwa Assert_Raise Jednostka testowania i stosowania wyjątku klasy

Sprawowanie prosi napisać badanej jednostki dla każdej funkcji przewidzianej. Jedną z testowanych przeze mnie pozycji jest poprawny wyjątek. Sugerujemy, abyśmy używali do tego celu assert_raise.

Oto kod I 'm testowania:

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 

A oto test, za parse_verb funkcji:

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 

Kiedy wykonać test, to się nie powiedzie, a oto wiadomość Otrzymuję:

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 

W oparciu o moje zrozumienie funkcji assert_raise, ten test powinien przejść, czy jest coś złego w sposobie, w jaki go używam?

Jeśli ktoś chciałby pełny kod źródłowy wszystkich plików Pracuję z I jest ona dostępna here

Odpowiedz

28

assert_raise spodziewa się jeden lub więcej klas wyjątków jako jego parametrów, zamiast instancji wymaganego wyjątku.

Zwraca również wyjątek podniesiony, więc jeśli chcesz potwierdzić komunikat (lub inne właściwości), możesz to zrobić osobno. Więc spróbuj wymienić:

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

z:

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

Dzięki za pomoc! To naprawiło mój problem. –

2

jakiegoś powodu odpowiedź podane powyżej nie działa dla mnie (używam Ruby 2.0.0).

I ma zawinąć nazwę klasy błędów w łańcuchu go do pracy:

assert_raise("RuntimeError") { 
    # some code to trigger the error 
} 
Powiązane problemy