let()
変数を初期化するためにrspecで使用するための多くのサポートがあるようです。@name
代わりにインスタンス変数(つまり)を使用する場合はどうなりますか?
2 に答える
いくつかの理由から、私は常にインスタンス変数よりも let を好みます。
インスタンス変数は参照されると存在します。つまり、インスタンス変数のスペルを間違えると、新しいインスタンス変数が nil に初期化されるため、間違いなくいくつかの問題が発生します。しかし let では、スペルを間違えると NameError が発生します。
さらに、before ブロックでインスタンス変数を初期化します。つまり、spec が初期化したインスタンス変数を使用しない場合でも、spec が実行されるたびに before ブロックが実行されます。以下に例を示します。
before do @user = Factory :user @movie = Factory :movie end it "should have user" do @user.should eq User.first end it "should have movie" do @movie.should eq Movie.first end
すべての仕様は正常に動作しますが@movie
、最初の仕様では使用されておらず@user
、2 番目の仕様では使用されていません。
bang "!" で let を使用することもできます。let!
、let
遅延評価され、呼び出されない場合はインスタンス化されません。let
メモ化されたヘルパーを定義するために使用しますが、let!
各メソッド呼び出しの前に強制的に評価されます。
私はこの質問に賛成しましたが、最後に自分で質問に答えています。
まずは違いを説明
let
メソッドを使用すると、テストで参照されるまで変数が初期化されません。これにより、最初から初期化されるものとは異なります@instance variables
。
一般的に大きな違いはありません。オブジェクトが初期化@instance variables
されていることを確認したい場合に使用します。let
しかし一方で、これは と同じように実行できるlet!
ため、 を使用する明確な理由はありません@instance variable
。
結論として、私には、overを使用する明白な理由がありますが、 overを使用する明確な理由はありません@instance variable
let
@instance variables
let!
@instance variables
ロードに時間がかかり、それらを使用するとコードが不要に複雑になる可能性があり、let
またはを使用することで回避できますlet!
これら2つの回答もご覧ください。おそらく、さらに情報が得られます。