传递一个例子来自"它"阻止"让"在RSpec阻止

时间:2017-11-08 11:47:11

标签: ruby-on-rails ruby rspec

我正在观看使用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魔术?感谢。

1 个答案:

答案 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块也始终能够正确地重新评估当前示例。