🖥
#Rails + #rspec で let と let! (ビックリありなし) の違いを誤解していた。遅延評価ってなによ?
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
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
公開日時
2019-12-17
Discussion