ruby - 正确的 Assert_Raise 单元测试和异常类的使用

标签 ruby unit-testing assert assertraises learn-ruby-the-hard-way

我正在研究 Exercise 49 of Learn Ruby the Hard Way

练习要求为提供的每个函数编写单元测试。我正在测试的项目之一是是否引发了适当的异常。建议我们为此使用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

当我运行测试时,它失败了,这是我收到的消息:

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

根据我对assert_raise函数的理解,这个测试应该可以通过,是不是我的使用方式有问题?

如果有人想要我正在使用的所有文件的完整源代码,可以使用它 here

最佳答案

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) 

关于ruby - 正确的 Assert_Raise 单元测试和异常类的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7296600/

相关文章:

ruby-on-rails - 用于开发环境的 Ruby on Rails 环境变量

ruby - 每当 Heroku 应用程序重新启动时运行任务的好方法是什么?

ruby - Mountain Lion 的 RVM 问题

unit-testing - TDD - 一次测试还是批量测试?

c++ - 断言由 OpenCV checkVector() 在其他有效 vector<vector<Point3f>> 上抛出

ruby-on-rails - 调用 bundler 时 bundle 加载错误

javascript - 用 Jest 模拟 require 语句

java - .ParameterResolutionException : No ParameterResolver registered for parameter [jUnit 5 Tests]

c++ - 如何使用 Visual Studio 自动记录断言?

python - 在 Python 中禁用断言