Rspec-hooks
RSpec-フック
単体テストを作成する場合、テストの前後にセットアップコードとティアダウンコードを実行すると便利なことがよくあります。 セットアップコードは、テストの条件を構成または「セットアップ」するコードです。 分解コードはクリーンアップを行い、後続のテストで環境が一貫した状態になるようにします。
一般的に、テストは互いに独立している必要があります。 テストのスイート全体を実行し、そのうちの1つが失敗した場合、テスト中のコードにバグがあり、前のテストが環境を一貫性のない状態にしたためではなく、失敗したことを確信する必要があります。
RSpecで使用される最も一般的なフックは、フックの前後です。 これらは、上記で説明したセットアップおよび分解コードを定義および実行する方法を提供します。 このサンプルコードを考えてみましょう-
このコードを実行すると、次の出力が得られます-
何が起こっているかを詳しく見てみましょう。 before(:each)メソッドは、セットアップコードを定義する場所です。 :each引数を渡すと、サンプルメソッドグループの各サンプルの前にbeforeメソッドを実行するように指示しています。 上記のコードの記述ブロック内の2つのitブロック。
@simple_class = SimpleClass.newという行では、SimpleClassクラスの新しいインスタンスを作成し、それをオブジェクトのインスタンス変数に割り当てています。 あなたが疑問に思うかもしれないオブジェクトは何ですか? RSpecは、describeブロックのスコープ内でバックグラウンドで特別なクラスを作成します。 これにより、このクラスのインスタンス変数に値を割り当てることができ、例のitブロック内でアクセスできます。 これにより、テストでよりクリーンなコードを簡単に記述できます。 各テスト(例)にSimpleClassのインスタンスが必要な場合、そのコードをbeforeフックに入れることができ、各例に追加する必要はありません。
「Creating a new instance of the SimpleClass class」という行がコンソールに2回書き込まれていることに注意してください。これは、各* itブロック*でフックが呼び出される前を示しています。
前述したように、RSpecにはafterフックもあり、beforeフックとafterフックの両方が引数として使用できます。 afterフックは、指定されたターゲットの後に実行されます。 すべてのターゲットは、すべての例の前/後にフックが実行されることを意味します。 各フックがいつ呼び出されるかを示す簡単な例を次に示します。
上記のコードを実行すると、この出力が表示されます-