letの遅延評価は各it,example内で定義したものが呼ばれない限り実行されなくなります。
そのせいで困る具体例をあげます。
例えば、let!のところをletにすると、User.allが[ ]になります。User.findとかもできません。
(http://qiita.com/jnchito/items/cdd9eef2ed193267c651#2-%E7%84%A1%E9%A7%84%E3%81%AA%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%AE%E6%99%82%E9%96%93%E3%82%92%E7%84%A1%E3%81%8F%E3%81%9B%E3%82%8B)
describe “sugoi_method" do
context “すごい処理をした場合" do
let!(:user) {create(:user, id: 1, email: 'user@basicinc.jp')}
it “すごいデータがつくられる" do
User.all #-> [User~]
end
end
end
describe “sugoi_method" do
context “すごい処理をした場合" do
let(:user) {create(:user, id: 1, email: 'user@basicinc.jp')}
it “すごいデータがつくられる" do
User.all #-> [ ]
end
end
end
注意
letは、このような動作になりますが、
遅延評価は無駄な初期化の時間をなくせるので有効に使うべきではあります。
例えば、let!にした場合、itごとに変数が初期化されます。
つまり、その分、使わない変数のための処理にかける時間が多くなります。
「let!使いすぎはよくないよ」と言う解説を見かけるのは、その理由からです。