Ruby on Rails

letの実行タイミングを勘違いしていた話

環境

Ruby 2.5.0
RSpec 3.7.1
Rails 5.2.0

RSpecのlet/let!をうまく使うと、Beforeブロック内にインスタンス変数をあれこれ書いてぐちゃぐちゃなコードになってしまう展開を防げる。

この例だけだと分かりにくいが、インスタンス変数をRspecで乱発すると後々だんだんと可読性が下がり変数の汚染も広がるので、letに置き換えてみる。

ここで本題。

letに置き換えた後のコードについて、

これはfactory botを利用したcreateだが、

このpost先の処理が「create(:book)されていること」を前提に書かれていた場合、エラーになる。

なぜかというと、let(/let!)ブロック内の評価タイミングは「自身が初回に呼び出されたタイミング」だから。
つまり変な話、

これだとitの前に必ずbookがコールされるのでこのテストは通るようになる。
letに置き換えるのはいいけど、実行されるタイミングは知っておこう、という話でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です