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