使用Rspec进行Stubbing睡眠方法。

时间:2015-10-30 10:20:07

标签: ruby-on-rails ruby rspec

我的方法看起来像这样:

until panel_import.completed?
  panel_import.update_status
  sleep 1.minute
end

现在,当我运行我的规格时,我必须等待1分钟,这是不好的。我该如何存根?我正在阅读很多主题,但我没有找到解决方案......

2 个答案:

答案 0 :(得分:1)

正如@Rubyrider所述,此链接提供了很好的帮助:RSpec: stubbing Kernel::sleep?

总结该答案,您可以允许调用sleep的班级接收sleep方法:

# Class that calls `sleep`
class Foo
  def run
    sleep 5
  end
end

# Specs
...
describe '#run' do
  before { allow_any_instance_of(Foo).to receive(:sleep) }

  # your tests
end

这将模拟sleep方法并防止在这些测试期间运行它。

虽然您也可以在代码中检查Rails.env.test?,并将sleep作为@MilesStanfield建议,但我总是尽量避免在我的常规代码中使用与我的测试相关的代码

答案 1 :(得分:0)

如果是我,我只需添加一个Rails.env.test?,这样您的测试就不会进行睡眠调用。像这样......

until panel_import.completed?
  panel_import.update_status
  sleep 1.minute unless Rails.env.test?
end