人々はそれらが異なるいくつかの基本的な方法を説明したように見えますが、before(:all)
省略され、それらが使用されるべき理由を正確に説明していません。
インスタンス変数は、この回答で述べられている理由の一部が原因で、仕様の大部分で使用されていないため、ここではそれらをオプションとして言及しません。
ブロックしましょう
let
ブロック内のコードは参照されたときにのみ実行されます。つまり、遅延読み込みは、これらのブロックの順序が関係ないことを意味します。これにより、仕様に基づく繰り返しのセットアップを削減するための大きなパワーが得られます。
これの1つの(非常に小さくて不自然な)例は次のとおりです。
let(:person) { build(:person) }
subject(:result) { Library.calculate_awesome(person, has_moustache) }
context 'with a moustache' do
let(:has_moustache) { true }
its(:awesome?) { should be_true }
end
context 'without a moustache' do
let(:has_moustache) { false }
its(:awesome?) { should be_false }
end
has_moustache
それぞれのケースで定義が異なっていることがわかりますが、subject
定義を繰り返す必要はありません。注意すべき重要な点はlet
、現在のコンテキストで定義されている最後のブロックが使用されることです。これは、大部分の仕様で使用されるデフォルトを設定するのに適しています。必要に応じて上書きできます。
たとえば、trueに設定されcalculate_awesome
たperson
モデルが渡された場合の戻り値をチェックtop_hat
しますが、口ひげはありません。
context 'without a moustache but with a top hat' do
let(:has_moustache) { false }
let(:person) { build(:person, top_hat: true) }
its(:awesome?) { should be_true }
end
letブロックについてもう1つ注意すべき点は、データベースに保存されているもの(つまりLibrary.find_awesome_people(search_criteria)
)を検索する場合は、ブロックが既に参照されていない限りデータベースに保存されないため使用しないことです。let!
またはbefore
ブロックはここで使用されるべきものです。
また、ブロックの実行をトリガーするために使用することは決してありません。これが目的です。before
let
let!
しましょう!ブロック
let!
ブロックは定義された順序で実行されます(beforeブロックのように)。beforeブロックとの主な違いの1つは、インスタンス変数にフォールバックする必要がなく、この変数への明示的な参照を取得することです。
同様にlet
、複数の場合は、ブロック、let!
ブロックが同じ名前で定義されている、最新の実行で使用されるものです。主な違いは、let!
このように使用するとブロックが複数回実行されるのに対し、let
ブロックは最後にのみ実行されるということです。
before(:each)ブロック
before(:each)
はデフォルトのbeforeブロックなのでbefore {}
、before(:each) {}
毎回完全を指定するのではなく参照することができます。
before
いくつかの中核的な状況でブロックを使用することが私の個人的な好みです。以下の場合、beforeブロックを使用します。
- 私はモック、スタブ、ダブルスを使用しています
- 適切なサイズの設定があります(通常、これは工場の特性が正しく設定されていないことを示す兆候です)
- 直接参照する必要のない変数がいくつかありますが、設定には必須です
- Railsで機能コントローラーテストを作成していて、テストする特定の要求を実行したい(つまり
before { get :index }
)。subject
多くの場合にこれを使用できますが、参照が必要ない場合は、より明示的に感じることがあります。
before
仕様に合わせて大きなブロックを作成している場合は、工場をチェックして、特性とその柔軟性を完全に理解していることを確認してください。
before(:all)ブロック
これらは、現在のコンテキスト(およびその子)の仕様の前に一度だけ実行されます。これらは、正しく記述されていれば、実行と労力を削減できる特定の状況があるため、非常に有利に使用できます。
1つの例(実行時間にほとんど影響しない)は、テストのためにENV変数をモックアウトすることです。これは、一度だけ実行する必要があるはずです。
それが役に立てば幸い:)