我是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,因为它们位于同一个文件夹中,我认为问题不在于测试脚本无法找到无类脚本。
我很欣赏任何启示。提前谢谢。
答案 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"运算符,在这种情况下将数组转换为参数列表。
然后,您可以进一步重构,使您的类更易于测试,例如将运行分解为更小的方法,根据需要将现有方法转换为私有方法,将责任分解为其他类等等。