Ruby “加速”;“睡眠”;红宝石色

Ruby “加速”;“睡眠”;红宝石色,ruby,testing,rspec,cucumber,sleep,Ruby,Testing,Rspec,Cucumber,Sleep,在我的代码中,有很多地方我特意放了“睡眠”,只是因为这些特性需要如此。然而,当我使用RSpec或Cucumber进行测试时,它会变得很麻烦,因为完成测试需要很长时间 更新:谢谢你的一些建议。但是,存根或手动重新定义都可能很麻烦。我所想象的只是一个用刻度来加速“睡眠”的微调 有一个宝石警察。它可以加速时间。现在是一个刻度。如果这样的想法可以应用到睡眠中,那就太好了 参考: 更新:很抱歉反应太晚,下面可以说明我的情况: class SomeClass def some_method

在我的代码中,有很多地方我特意放了“睡眠”,只是因为这些特性需要如此。然而,当我使用RSpec或Cucumber进行测试时,它会变得很麻烦,因为完成测试需要很长时间

更新:谢谢你的一些建议。但是,存根或手动重新定义都可能很麻烦。我所想象的只是一个用刻度来加速“睡眠”的微调

有一个宝石警察。它可以加速时间。现在是一个刻度。如果这样的想法可以应用到睡眠中,那就太好了

参考:


更新:很抱歉反应太晚,下面可以说明我的情况:

class SomeClass
    def some_method
        sleep 15
        make_api_call_A
        sleep 45
        make_api_call_B
    end
end

describe SomeClass do
    before do
        Acceleration.speed_up(10) # speed time up to 10x
    end

    after do
        Acceleration.reset
    end

    if "should make two API calls" do
        subject.some_method
    end
end

正如您所见,在某些方法中,有两种睡眠持续时间不同。我更喜欢的是,如果我能把睡眠时间提高到10倍,而不是等60秒,我只需要等6秒。这大大加快了测试过程。

仅在测试时临时添加以下内容

def sleep *; end

仅在测试时临时添加以下内容

def sleep *; end

您需要在规范中使用存根
sleep
调用

class SomeClass
  def some_method
    sleep 10
  end
end

describe SomeClass do
  before do
    subject.stub!(:sleep)
  end

  it "should call sleep" do
    subject.should_receive(:sleep).with(10)
    subject.some_method
  end
end

您需要在规范中使用存根
sleep
调用

class SomeClass
  def some_method
    sleep 10
  end
end

describe SomeClass do
  before do
    subject.stub!(:sleep)
  end

  it "should call sleep" do
    subject.should_receive(:sleep).with(10)
    subject.some_method
  end
end

如果要缩放睡眠,可以通过以下方式覆盖
Kernel.sleep
方法:

module Acceleration
  mattr_accessor :sleep_scale

  def self.speed_up(scale)
    self.sleep_scale = scale
  end

  def self.reset
    self.sleep_scale = 1
  end

  reset
end

module Kernel
  alias :original_sleep :sleep

  def sleep(time)
    original_sleep(time / Acceleration.sleep_scale.to_f)
  end
end

class SomeClass
  def some_method
      sleep 15
      make_api_call_A
      sleep 45
      make_api_call_B
  end
end

describe SomeClass do
  before do
    Acceleration.speed_up(10) # speed time up to 10x
  end

  after do
    Acceleration.reset
  end

  it "should make two API calls" do
    subject.some_method
  end
end

如果要缩放睡眠,可以通过以下方式覆盖
Kernel.sleep
方法:

module Acceleration
  mattr_accessor :sleep_scale

  def self.speed_up(scale)
    self.sleep_scale = scale
  end

  def self.reset
    self.sleep_scale = 1
  end

  reset
end

module Kernel
  alias :original_sleep :sleep

  def sleep(time)
    original_sleep(time / Acceleration.sleep_scale.to_f)
  end
end

class SomeClass
  def some_method
      sleep 15
      make_api_call_A
      sleep 45
      make_api_call_B
  end
end

describe SomeClass do
  before do
    Acceleration.speed_up(10) # speed time up to 10x
  end

  after do
    Acceleration.reset
  end

  it "should make two API calls" do
    subject.some_method
  end
end
猴子补丁内核#睡眠 假设您在这里确实有一个有效的用例,并且您不想重构代码以避免硬编码的睡眠值或完全禁用睡眠,那么您可以简单地在您的规范中使用一个缩放因子。例如,要使睡眠运行速度快十倍(例如,指定时间的1/10):

对您的缩放进行基准测试 一旦你完成了猴子修补睡眠,你就可以测试你的缩放效果:

猴子补丁内核#睡眠 假设您在这里确实有一个有效的用例,并且您不想重构代码以避免硬编码的睡眠值或完全禁用睡眠,那么您可以简单地在您的规范中使用一个缩放因子。例如,要使睡眠运行速度快十倍(例如,指定时间的1/10):

对您的缩放进行基准测试 一旦你完成了猴子修补睡眠,你就可以测试你的缩放效果:


只需用变量/配置替换硬编码的
sleep
值。我不确定是否理解您的问题所在。您能否添加一个示例,说明您的功能需要
睡眠
?存根有多“麻烦”?这就是存根发明的目的。你为什么要用睡眠呢?使用轮询代替。您好,我更新了我的问题,请查看您是否仍感兴趣。只需将硬编码的
sleep
值替换为变量/配置。我不确定是否理解您的问题所在。您能否添加一个示例,说明您的功能需要
睡眠
?存根有多“麻烦”?这就是存根发明的目的。你为什么要用睡眠呢?改为使用轮询。嗨,我更新了我的问题,如果您仍然感兴趣,请看一看。嗨,我更新了我的问题,如果您仍然感兴趣,请看一看。嗨,我更新了我的问题,如果您仍然感兴趣,请看一看。嗨,Dmitry,非常感谢。它起作用了。此外,我将纳入更多的功能,使其成为一个宝石。你想在它出版时被记入贷方吗?:)嗨,德米特里,非常感谢。它起作用了。此外,我将纳入更多的功能,使其成为一个宝石。你想在它出版时被记入贷方吗?:)