🖥

#Rails + #rspec で let と let! (ビックリありなし) の違いを誤解していた。遅延評価ってなによ?

2019/12/17に公開
    let!(:user) { create :user, name: 'アリス' }
    let!(:user) { create :user, name: 'ボブ' }
    let!(:user) { create :user, name: 'キャロル' }

こんな風に同じletの名前で複数回実行したら、そのたびletが実行されるものかと思っていたら、違うようだ。
let! で書いても、最後に書いたものだけが実行されるように見える。

require "rails_helper"

# There cases all pass
describe do
  context do
    let!(:user) { create :user, name: 'アリス' }

    # it create a record before expect "user" in spec
    it do
      expect(User.count).to eq 1
      expect(user.name).to eq 'アリス'
      expect(User.count).to eq 1
    end
  end

  context do
    let(:user) { create :user, name: 'ボブ' }

    # it does not create a record before expect "user" in spec
    it do
      expect(User.count).to eq 0
      expect(user.name).to eq 'ボブ'
      expect(User.count).to eq 1
    end
  end
end

describe do
  context do
    # Let bang and same let names
    # It does not create three records
    # only last let! evaluated
    let!(:user) { create :user, name: 'アリス' }
    let!(:user) { create :user, name: 'ボブ' }
    let!(:user) { create :user, name: 'キャロル' }

    it do
      expect(User.count).to eq 1
      expect(user.name).to eq 'キャロル'
      expect(User.count).to eq 1
    end
  end

  context do
    # Different let names
    # It create each three records
    let!(:user1) { create :user, name: 'アリス' }
    let!(:user2) { create :user, name: 'ボブ' }
    let!(:user3) { create :user, name: 'キャロル' }

    it do
      expect(User.count).to eq 3
      expect(user1.name).to eq 'アリス'
      expect(user2.name).to eq 'ボブ'
      expect(user3.name).to eq 'キャロル'
      expect(User.count).to eq 3
    end
  end
end

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2850

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2019-12-17

Discussion