Bon Assert_Raise de Tests Unitaires et d'Utilisation de la Classe d'Exception
Je suis en train de travailler sur Exercice 49 d'Apprendre Ruby à la Dure
L'exercice vous demande d'écrire un test unitaire pour chaque fonction. L'un des éléments que je suis en train de tester si une bonne exception est levée. Il est suggéré que nous utilisons assert_raise
à cette fin.
Voici le code, je suis en train de tester:
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
Et voici le test, pour la fonction 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
Quand je lance le test, il échoue et voici le message que je reçois:
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
Basé sur ma compréhension de la assert_raise
fonction, ce test devrait passer, est-il quelque chose de mal avec la façon dont je suis à l'aide?
Si quelqu'un voudrais un code source complet de tous les fichiers, je travaille avec je il est disponible ici
OriginalL'auteur Andrew Lauer Barinov | 2011-09-04
Vous devez vous connecter pour publier un commentaire.
assert_raise
s'attend à une ou plusieurs classes d'exception comme ses paramètres, plutôt que d'une instance de la nécessaire exception.Il renvoie également l'exception soulevée donc, si vous voulez faire valoir le message (ou de toute autre propriété), vous pouvez le faire séparément. Donc, essayez de remplacer:
avec:
comme @Felipe Almeida mentionné, à partir de ruby 2.0.0 à partir de l'API pour les
assert_raise
a changé. L'exécution du bloc doit maintenant être entouré avecdo ... end
pour que cela fonctionne. Voir la documentation ici: ruby-doc.org/stdlib-2.0.0/libdoc/test/unit/rdoc/Test/Unit/...OriginalL'auteur Steve
Pour une raison quelconque, la réponse donnée ci-dessus ne fonctionne pas pour moi (je suis en utilisant Ruby 2.0.0).
Je doit envelopper l'Erreur de nom de classe dans une Chaîne de caractères pour que cela fonctionne:
OriginalL'auteur Felipe Almeida