前提
rspec --version
RSpec 3.10
- rspec-core 3.10.1
- rspec-expectations 3.10.1
- rspec-mocks 3.10.2
- rspec-rails 5.0.2
- rspec-support 3.10.2
問題
このテストファイルを実行した時、標準出力にはどの順番で何が出力されるでしょうか。
以下のポイントに注意してください。
- 一番外側の
:a
はlet!
で正格評価になっている - context内の
:a
はlet
で遅延評価になっている -
expect(a).to be true
されている
この記事のタイトルのことはひとまず忘れて、純粋な気持ちで問題を解いてみてください。
sample_spec.rb
RSpec.feature type: :system do
let!(:a) do
pp 'outer variable (let!)'
true
end
before do
pp 'outer before'
end
context do
let(:a) do
pp 'inner variable (let)'
true
end
before do
pp 'inner before'
end
# 実行されるテスト
it do
pp 'inner it'
expect(a).to be true
end
end
end
解答
"inner variable (let)"
"outer before"
"inner before"
"inner it"
補足
外側の変数が let(:a)
で、両方の変数が遅延評価になっている場合は、純粋に遅延評価され、以下のようになる。
"outer before"
"inner before"
"inner it"
"inner variable (let)"
expect(a).to be true
のタイミングで a
が評価されるためである。
しかし外側に let!
がある場合は let!
が本来評価されるタイミングで内側のcontext側の let
が評価されるため、解答のような順番になる。