let
と let!
let
を使用してメモ化されたヘルパーメソッドを定義します。この値は、同じ例内での複数の呼び出しではキャッシュされますが、例と例の間ではキャッシュされません。
let
は遅延評価されることに注意してください。定義されたメソッドが最初に呼び出されるまで評価されません。各例の前にメソッドの呼び出しを強制するには、let!
を使用できます。
デフォルトでは、let
はスレッドセーフですが、config.threadsafe
を無効にすることでスレッドセーフでないように設定することもできます。これにより、let
のパフォーマンスがわずかに向上します。
let
を使用してメモ化されたヘルパーメソッドを定義する
次の内容で "let_spec.rb" という名前のファイルがあるとします:
$count = 0
RSpec.describe "let" do
let(:count) { $count += 1 }
it "memoizes the value" do
expect(count).to eq(1)
expect(count).to eq(1)
end
it "is not cached across examples" do
expect(count).to eq(2)
end
end
rspec let_spec.rb
を実行すると、
すべての例がパスするはずです。
let!
を使用して、before
フック内で呼び出されるメモ化されたヘルパーメソ ッドを定義する
次の内容で "let_bang_spec.rb" という名前のファイルがあるとします:
$count = 0
RSpec.describe "let!" do
invocation_order = []
let!(:count) do
invocation_order << :let!
$count += 1
end
it "calls the helper method in a before hook" do
invocation_order << :example
expect(invocation_order).to eq([:let!, :example])
expect(count).to eq(1)
end
end