letとlet!の違い

rspec-rails (~> 2.13.0)

テストが見やすくなってる気がするので自分はletよくつかいます。

違い

目的は同じくメモ化で、違いはタイミングだけっぽい。

何が違うのかと言うと

letは引数のシンボル名が呼ばれるまでは評価されない。
let!だと、beforeが始める前に評価される。

普通に使うのであればletで足りるけど次のようなケースだとlet!したくなるはず。

describe UserController do
  describe "GET index" do
    let!(:user) { FactoryGirl.create(:user) }
    before { get :index }
    it { expect(user).to eq(User.all)
  end
end

みたいな感じでindexアクションを実行する前にuserレコードを作成したい時に使う感じだと思う。