我正在通过学习Ruby The Hard Way工作,并在exercise 49中遇到了一些有趣的东西。
在parser.rb
中,我在顶层有一个名为skip(word_list, word_type)
的函数,用于跳过用户输入中的无回复词(例如停用词)。它没有封装在类或模块中。根据练习,我必须为解析器编写一个单元测试。
这是我的单元测试代码:
require "./lib/ex48/parser"
require "minitest/autorun"
class TestGame < Minitest::Test
def test_skip()
word_list = [['stop', 'from'], ['stop', 'the'], ['noun', 'west']]
assert_equal(skip(word_list, 'stop'), nil)
assert_equal(skip([['noun', 'bear'], ['verb', 'eat'], ['noun', 'honey']], 'noun'), nil)
end
end
但是,当我从命令行运行rake test TESTOPTS="-v"
时,会跳过这些特定的测试。这似乎是因为Minitest模块中的skip
方法存在冲突,因为我将名称更改为skip_words
后运行完美。
有人可以请一下解释这里发生了什么吗?
答案 0 :(得分:1)
&#34;顶级功能&#34;实际上也是方法,特别是它们是Object上的私有实例方法(main
对象周围有一些琐事但这里并不重要)
然而,minitest的Test类也有一个skip
方法,因为单个测试是Test
的子类上的实例方法,所以你最终会调用该方法。
这不是解决这个问题的一种非常简单的方法 - 与某些语言不同,没有简单的方法可以说你想要召唤一个特定的超级类别&#39;实施某事
除了重命名您的方法之外,您还必须选择另一种方式来调用它,例如:
Object.new.send(:skip, list, type)
Object.instance_method(:skip).bind(self).call(list, type)
当然,你可以将它包装在一个帮助方法中进行测试,甚至可以重新定义这个特定Test
子类的跳过(尽管这可能导致某些人试图称之为minitest&#39; { {1}}。