什么是在ruby中测试函数输入的适当方法

时间:2013-06-30 05:34:09

标签: ruby

我有几个ruby函数,想要检查输入是否正确以及输入是否有意义。什么是明智的方法呢?

以下是我拥有的一个功能以及我想要检查的内容的示例

# Converts civil time to solar time
# civilT: Time object
# longitude: float
# timezone: fixnum
def to_solarT(civilT,longitude,timezone)
    # pseudo code to check that input is correct
    assert(civilT.class == Time.new(2013,1,1).class)
    assert(longitude.class == 8.0.class)
    assert(timezone.class == 1.class)

    # More pseudocode to check if the inputs makes sense, in this case 
    # whether the given longitude and timezone inputs make sense or whether 
    # the timezone relates to say Fiji and the longitude to Scotland. Done 
    # using the imaginary 'longitude_in_timezone' function
    assert(longitude_in_timezone(longitude,timezone))
end

我在这里找到了一个相关的问题:how to put assertions in ruby code。这是方法还是有更好的方法来测试ruby中的函数输入?

2 个答案:

答案 0 :(得分:3)

你不应该这样做。 Ruby很大程度上依赖于duck-typing。也就是说,如果它像鸭子一样嘎嘎叫,它就是一只鸭子。即只使用你收到的对象,如果他们确实做出了正确的反应,那就没问题了。如果他们不这样做,你可以拯救NoMethodError并显示相应的输出。

答案 1 :(得分:3)

assert不是标准的Ruby方法,并且经常被测试框架使用,所以我认为把它放在代码中并不好。此外,创建要检查参数的类的实例是没有意义的。更直截了当,

def to_solarT civilT, longitude, timezone
  raise "Argument error blah blah" unless Time === civilT
  raise "Argument error blah blah" unless Float === longitude
  raise "Argument error blah blah" unless Fixnum === timezone
  ...
end