消除Ruby中的函数调用

时间:2015-01-05 09:35:39

标签: ruby module mixins

我正在通过学​​习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后运行完美。

有人可以请一下解释这里发生了什么吗?

1 个答案:

答案 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}}。