1. ホーム
  2. ruby

[解決済み] RSpecのlet()はいつ使うのか?

2022-03-20 21:15:54

質問

インスタンス変数を設定するためにbeforeブロックを使用することが多いです。そして、それらの変数を私の例全体で使用します。 最近、私は let() . RSpecのドキュメントによると、これは次のように使用されます。

... メモ化されたヘルパーメソッドを定義するため。この値は、同じ例で複数回呼び出すとキャッシュされますが、複数の例で呼び出すとキャッシュされません。

ビフォアブロックでインスタンス変数を使うのとどう違うのですか?また、どのような場合に let()before() ?

解決方法は?

私はいつも let をインスタンス変数に置き換えたのは、いくつかの理由があります。

  • インスタンス変数は、参照された時点で存在するようになります。 つまり、インスタンス変数のスペルをファットフィンガーすると、新しいものが作成され、初期化されて nil これは微妙なバグや誤検出を引き起こす可能性があります。 このため let はメソッドを作成するので NameError というのは、スペルを間違えたとき、私はそれが望ましいと思うからです。 スペックをリファクタリングしやすくなりますしね。
  • A before(:each) フックは、たとえそのサンプルがフックで定義されたどのインスタンス変数も使用しない場合でも、各エクスプレスの前に実行されます。 これは通常大きな問題ではありませんが、もしインスタンス変数のセットアップに長い時間がかかるなら、サイクルを浪費していることになります。 で定義されたメソッドに対して let 初期化コードは、例で呼び出された場合のみ実行されます。
  • を変更することなく、サンプル内のローカル変数から直接letにリファクタリングすることができます。 を参照する構文です。 インスタンス変数にリファクタリングする場合は、以下のように変更する必要があります。 を追加する)。 @ ).
  • これは少し主観的ですが、Mike Lewisが指摘したように、仕様を読みやすくしていると思います。 私は、すべての依存オブジェクトを let を維持し、自分の it ブロックを短くする。

関連リンクはこちらです。 http://www.betterspecs.org/#let