Ruby:如何在使用Test :: Unit时引用无类脚本?

时间:2015-06-12 19:27:09

标签: ruby unit-testing

我是Ruby的新手,上周才拿起它。目前使用Ruby 2.0。到目前为止,我一直在寻找方法和谷歌搜索我遇到的问题,这一直进展顺利,但现在我已经难以接受谷歌似乎没有答案的东西。

我有一个脚本通过open-uri拉取数据并处理该数据(让我们称之为pullrequest.rb)。我现在必须为此编写测试。当我写下pullrequest.rb时,我认为将它作为一个类是没有意义的,现在我不确定我是否可以使它成为一个类。它很长,需要参数,有一个包装脚本来调用它,等等。但是我确实在pullrequest.rb中定义了方法。

因此,您可以使用Test :: Unit对您的工作进行断言,但似乎您正在测试的.rb中有一个类。所以你可以写一个断言:

assert_equal("Kei", KTest.new.greeting("hi"))

如果您正在测试的脚本在KTest中有KTest类和方法问候语。但是你如何引用像pullrequest.rb这样没有类的脚本中的方法呢?我尝试过Kernel.greeting,Object.greeting,只是问候自己(在寻求帮助之前,我非常想尝试任何我能想到的事情)。我读到了here

我添加了{require_lative}位here,因为它们位于同一个文件夹中,我认为问题不在于测试脚本无法找到无类脚本。

我很欣赏任何启示。提前谢谢。

1 个答案:

答案 0 :(得分:0)

在没有看到你的代码的情况下,我建议进行重构,将你的脚本变成一个类(然后在你的包装器脚本中实例化并调用它)。这将允许您封装您在课堂中创建的方法,允许对它们进行测试,并使您的生活更轻松。一般来说,在Ruby中预计一切都应该在一个类中(这就是为什么,正如你所发现的那样,你创建的方法隐含在一个类中,尽管你自己没有声明一个)。

一个简单的方法就是将现有的脚本包装成一个类的run方法,并包含你已经写入类中的其他方法,这样它们就可以了从新的run方法访问。

class PullRequest
  def initialize(*arguments)
    # Take the arguments from your wrapper/caller script and turn them
    # into instance variables as necessary
    @arg1 = ...
  end

  def run
    # all the script code you currently have
  end

  # put the other methods you defined within the class as well:

  def method1(...)
  end

  def method2(...)
  end
end

然后你可以更新你的包装脚本来调用你的类:

# pullrequest_wrapper.rb
PullRequest.new(*ARGV).run

我假设您提到的参数来自命令行,因此ARGV。请注意*是" splat"运算符,在这种情况下将数组转换为参数列表。

然后,您可以进一步重构,使您的类更易于测试,例如将运行分解为更小的方法,根据需要将现有方法转换为私有方法,将责任分解为其他类等等。