【发布时间】:2017-10-30 05:45:09
【问题描述】:
我在模块的私有部分有以下方法...
def add_api_delay
sleep(retry_delay * (retry_multiplier_adjustment - retries)) if retries.positive?
end
到目前为止,我正在使用的规范看起来像这样......
let!(:klass) do
Class.new do
include AmazonMws::Shared::Utilities
attr_accessor :retries, :retry_multiplier_adjustment, :retry_delay
def initialize
@retries = 1
@retry_delay = 1
@retry_multiplier_adjustment = 2
end
def test_add_api_delay
add_api_delay
end
end
end
describe '.add_api_delay', focus: true do
# let(:kernel_spy) { class_spy(Kernel, sleep: true) }
before do
end
it 'sleeps retry api calls' do
# allow(klass).to receive(:sleep).with(1).and_return(kernel_spy)
# expect(kernel_spy).to have_received(:sleep)
# expect(Kernel).to receive(:sleep).with(1)
expect(Kernel).to receive(:sleep).and_return(true)
klass.new.test_add_api_delay
end
end
我有几个目标和原因想测试这个私有方法,但是如何验证 sleep 是否被调用。我不想减慢套件的速度,因此理想情况下我正在尝试对内核使用类间谍。我正在测试的任何东西似乎都不起作用。
更新
describe '.add_api_delay' do
before do
allow_any_instance_of(klass).to receive(:sleep).and_return(1)
end
it 'sleeps retry api calls' do
expect(klass.new.test_add_api_delay).to eq(1)
end
end
这可行,但是它并不理想,因为它会标记以下警察......
C: RSpec/AnyInstance: Avoid stubbing using allow_any_instance_of
allow_any_instance_of(klass).to receive(:sleep).and_return(1)
你有什么想法?
【问题讨论】:
标签: ruby-on-rails ruby rspec kernel