私はインスタンス変数を設定するためにbeforeブロックを使うことが多いです。そしてそれらの変数を例全体で使います。最近、 を見つけましたlet()
。RSpecのドキュメントによると、これは
... メモ化されたヘルパー メソッドを定義します。値は、同じ例内の複数の呼び出しにわたってキャッシュされますが、例間ではキャッシュされません。
これは before ブロックでインスタンス変数を使用することとどう違うのでしょうか? また、いつlet()
vsを使用すればよいのでしょうかbefore {}
?
ベストアンサー1
let
私はいくつかの理由から常にインスタンス変数を好みます:
- インスタンス変数は参照されると突然現れます。つまり、インスタンス変数のスペルを間違えると、新しいインスタンス変数が作成されて に初期化され
nil
、微妙なバグや誤検知につながる可能性があります。 はlet
メソッドを作成するので、NameError
スペルを間違えると が生成されますが、これは好ましいと思います。また、仕様のリファクタリングも容易になります。 - フック
before(:each)
は、各例の前に実行されます。これは、例がフックで定義されたインスタンス変数をまったく使用しない場合でも同様です。これは通常、大きな問題ではありませんが、インスタンス変数のセットアップに長い時間がかかる場合は、サイクルを無駄にしていることになります。 で定義されたメソッドの場合let
、初期化コードは、例がそれを呼び出した場合にのみ実行されます。 - 例の参照構文を変更せずに、例のローカル変数から let に直接リファクタリングできます。インスタンス変数にリファクタリングする場合は、例のオブジェクトを参照する方法を変更する必要があります (例: を追加します
@
)。 - これは少し主観的ですが、Mike Lewis が指摘したように、仕様が読みやすくなると思います。依存するすべてのオブジェクトを定義し
let
、it
ブロックを簡潔に保つという構成が気に入っています。
関連リンクはここにあります:http://www.betterspecs.org/#let