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!を使用する。