0

我有这个方法:

def self.should_restart?
  if Konfig.get(:auto_restart_time).present?
    Time.now>=Time.parse(Konfig.get(:auto_restart_time)) && Utils.uptime_in_minutes>780
  end
end

在常规 Ruby(不是 Rails)中,我将如何进行测试?我可以通过猴子补丁 Konfig 和 Utils 来返回我想要的东西,但这看起来太难看了。

4

2 回答 2

0

您也许可以将其timecop用作解决方案的一部分(这对我来说也是“有史以来最好的宝石”)。它使用简单,并且可以同步修补大多数时间数据源,因此,例如,如果您的Utils模块使用标准方法来评估时间,它应该具有与所示相同的“现在”概念Time.now

请注意,如果在另一个进程上调用外部 API,这将不起作用Utils,在这种情况下,您应该将其存根以返回测试断言中所需的正常运行时间值。

以下rspec片段作为示例,并对您可用的内容进行了一些假设(例如正在调用的被测模块Server

describe "#should_restart?"
  before :each do
    Timecop.travel( Time.parse("2013-08-01T12:00:00") )
    Server.start # Just a guess
    # Using `mocha` gem here
    Konfig.expect(:get).with(:auto_restart_time).returns( "18:00:00" )
  end

  after :each do
    Timecop.return
  end

  it "should be false if the server has just been started" do
    Server.should_restart?.should be_false
  end

  it "should be false before cutoff time" do
    Timecop.travel( Time.parse("2013-08-02T16:00:00") )
    Server.should_restart?.should be_false
  end

  it "should be true when the server has been up for a while, after cutoff time" do
    Timecop.travel( Time.parse("2013-08-02T18:05:00") )
    Server.should_restart?.should be_true
  end
end
于 2013-07-31T07:39:37.083 回答
0

使用模拟框架,如 rspec-mock、rr mock

于 2013-07-31T10:10:07.767 回答