我正在观看使用RSpec的code童网播,它有以下几行:
describe Game do
describe '#call' do
let(:description) do |example|
example.description
end
context 'when the choices are different' do
subject(:game) { described_class.new }
it 'rock beats scissors' do |example|
expect(subject.call('rock', 'scissors')).to eq(description)
end
end
end
end
我不太清楚example
论证如何进入' let'块?这是Ruby的东西还是RSpec魔术?感谢。
答案 0 :(得分:2)
See this line in the rspec-core
source:
# Simplified version of the code:
def let(name, &block)
# ...
if block.arity == 1
define_method(name) { super(RSpec.current_example, &nil) }
# ...
end
因为每个测试都会重新评估let
,所以可以重新定义它以包含当前测试上下文的知识。
另外值得注意的是RSpec.current_example
线程安全:
def self.current_example
RSpec::Support.thread_local_data[:current_example]
end
这意味着即使您正在运行并行测试,每个let
块也始终能够正确地重新评估当前示例。