我想知道如何将代码传递给共享示例。
我有这些规格(剪掉)
let(:property) { subject.send(type) }
context 'when one or both depending properties are not set' do
shared_examples_for 'not set' do |init_proc|
it "imperial.value returns nil" do
init_proc.call
expect(property.imperial.value).to eq(nil)
end
# 3 similar examples snipped
end
context "when neither is set" do
include_examples 'not set', Proc.new { }
end
context "when #{type1.inspect} is not set" do
include_examples 'not set', # error in this line
Proc.new { subject.send("#{type2}=", [100, :imperial]) }
end
context "when #{type2.inspect} is not set" do
include_examples 'not set',
Proc.new { subject.send("#{type1}=", [100, :imperial]) }
end
end
令我惊讶的是我得到的错误:
RuntimeError:
#let or #subject called without a block
我认为这会奏效。好像Proc.new
会立即调用主题,而是在我调用init_proc.call
时。那是怎么回事?
如果没有,那么导致错误的是什么?
PS。问题不是如何使这个代码工作。我得到了这段代码,我只对解释为什么我之前收到错误感兴趣。