0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

rspec豆知識: 外側let!と内側letの同名シンボルが混在する時に、内側letは外側のタイミングで評価される

Last updated at Posted at 2021-10-11

前提

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

問題

このテストファイルを実行した時、標準出力にはどの順番で何が出力されるでしょうか。
以下のポイントに注意してください。

  • 一番外側の :alet! で正格評価になっている
  • context内の :alet で遅延評価になっている
  • 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 が評価されるため、解答のような順番になる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?