2

我正在努力学习 Ruby 中的这个练习 49

该练习要求为提供的每个功能编写一个单元测试。我正在编写的单元测试之一是给我一个错误。

这是我正在测试的代码(word_list 是一个 Pair 结构数组)

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

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

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

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

这是测试:

def test_skip
    small_list = [Pair.new(:verb, 'go'), Pair.new(:verb, 'do')]
    skip(small_list, :verb)
    assert_equal([],small_list) 
end

这是我运行单元测试时遇到的错误:

  1) Error:
test_skip(SentenceTests):
TypeError: backtrace must be Array of String
    test_sentence.rb:23:in `test_skip'

在这种情况下,第 23 行引用“skip(small_list, :verb)”。我不确定为什么会发生此错误,上述两个函数也经过了单元测试,并且这些测试结果很好。

@Zabba,我确实将它们完全按照上面练习中的说明进行了放置:

class ParserError < Exception

end

如果有人需要查看我在这里使用的确切文件,请查看要点的链接: https ://gist.github.com/1190148

4

1 回答 1

2

线

skip(small_list, :verb)

使您的测试跳过整个列表(2 个动词)。最后,它是空的。没有方法/字段small_list.first的也是如此。nilword

我得到错误

undefined method `word' for nil:NilClass (NoMethodError)

尽管。

可能在您的代码中,此异常被其他一些代码捕获,这些代码本身会引发您所看到的异常。

更新

事实证明,在 Ruby 1.9 的 test/unit 中(更具体地说,在它所基于的 minitest/unit 中),有一种方法skip与您的skip. 请参阅minitest/unit.rb,第 610 行。该方法引发了异常,因为它期望其第二个参数是一个数组。

只需重命名您的skip.

于 2011-09-02T22:21:49.793 回答