let let! beforeの使い分け
役割
let,let!
- 変数の作成
before
- 変数の作成
- メソッド等の実行
let(:user) { create(:user) } let!(:user) { create(:user) } before do @user = create(:user) visit login_path login_as(@user) end
評価されるタイミング
let
- 変数が呼び出された時(遅延評価)
let!, before
- 各ブロックの前(事前評価)
let(:user) { create(:user, name: 'hogehoge') } ~~~(省略)~~~ expect(user.name).to eq 'hogehoge'
expect(user.name)の時点ではまだ評価されていないのでuserはnilであり、失敗する。 こういった場合にはlet!を使用する。