9

let()変数を初期化するためにrspecで使用するための多くのサポートがあるようです。@name代わりにインスタンス変数(つまり)を使用する場合はどうなりますか?

4

2 に答える 2

14

いくつかの理由から、私は常にインスタンス変数よりも 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!各メソッド呼び出しの前に強制的に評価されます。

于 2013-01-02T07:12:17.130 に答える
7

私はこの質問に賛成しましたが、最後に自分で質問に答えています。

まずは違いを説明

letメソッドを使用すると、テストで参照されるまで変数が初期化されません。これにより、最初から初期化されるものとは異なります@instance variables

一般的に大きな違いはありません。オブジェクトが初期化@instance variablesされていることを確認したい場合に使用します。letしかし一方で、これは と同じように実行できるlet!ため、 を使用する明確な理由はありません@instance variable

結論として、私には、overを使用する明白な理由がありますが、 overを使用する明確な理由はありません@instance variablelet@instance variableslet!

@instance variablesロードに時間がかかり、それらを使用するとコードが不要に複雑になる可能性があり、letまたはを使用することで回避できますlet!

これら2つの回答もご覧ください。おそらく、さらに情報が得られます。

RSpec let() をいつ使うべきか?

RSpec: let と before ブロックの違いは何ですか?

于 2013-03-26T13:41:36.493 に答える