との違いを非常に簡単な例で理解しましletたlet!。最初にドキュメントの文を読んでから、出力を実際に見てみましょう。
Let docについて:-
...letは遅延評価されます:定義されたメソッドが最初に呼び出されるまで評価されません。
以下の例との違いを理解しました:-
$count = 0
describe "let" do
let(:count) { $count += 1 }
it "returns 1" do
expect($count).to eq(1)
end
end
今それを実行しましょう:-
arup@linux-wzza:~/Ruby> rspec spec/test_spec.rb
F
Failures:
1) let is not cached across examples
Failure/Error: expect($count).to eq(1)
expected: 1
got: 0
(compared using ==)
# ./spec/test_spec.rb:8:in `block (2 levels) in <top (required)>'
Finished in 0.00138 seconds (files took 0.13618 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/test_spec.rb:7 # let is not cached across examples
arup@linux-wzza:~/Ruby>
なぜエラーなのか?なぜなら、docが言ったように、でlet、それが定義するメソッドが最初に呼び出されるまで評価されないからです。例ではcount、を呼び出さなかったため、$countまだ0、であり、増分されません1。
今、その部分に来ていlet!ます。ドキュメントは言っています
....あなたはletを使うことができます!各例の前にメソッドの呼び出しを強制します。これは、サンプル内でヘルパーメソッドを呼び出さなかった場合でも、サンプルが実行される前に呼び出されることを意味します。
これもテストしましょう:-
これが変更されたコードです
$count = 0
describe "let!" do
let!(:count) { $count += 1 }
it "returns 1" do
expect($count).to eq(1)
end
end
このコードを実行してみましょう:-
arup@linux-wzza:~/Ruby> rspec spec/test_spec.rb
.
Finished in 0.00145 seconds (files took 0.13458 seconds to load)
1 example, 0 failures
を参照してください、今$countは戻ります1、したがってテストは合格しました。let!これは、例の実行前に実行されたを使用したときに発生しましたが、例のcount内部では呼び出しませんでした。
これが方法letでありlet!、互いに異なります。