

勉強していると、わかりそうでわからない事が出てきました。

[インスタンス変数を見直したがほうがいい理由](https://shinkufencer.hateblo.jp/entry/2019/02/01/233000)

上記の記事を読むと、このように書いてありました。

> let だと必要なタイミングで呼び出されるが、before でのインスタンス変数定義だと全ての場合に呼び出される。そのため context
> などで場合わけしたときに不要な場面でも作られることになる。
>
>
> RSpecの場合、レコード生成やDBアクセスが実行時間に影響するケースが多いのでなるべくであれば生成する契機は少なくしたほうがいいので、そのような観点でもインスタンス変数は避けたほうがいい。

では、逆に `let!` を使わないと行けない場合はどんな場合なのだろう、という事がわかりません。

遅延評価したら、困る事はあるのでしょうか？

初心者ですので、なんとか易しめに教えて頂けると嬉しいです。  
よろしくお願い致します。


CC BY-SA 4.0
2020-05-07T11:11:55.917
66390
2020-05-07T13:03:57.103
2020-05-07T11:21:54.040
3060
40035
question
rspec
RSpec の let と let! の違いは？

[code]

    class Article < ApplicationRecord
      has_many :comments
    end
    
    class Comment < ApplicationRecord
      belongs_to :article
    end
    
[/code]

上記のようなモデルがあった時に、

[code]

    let(:article) { create(:article) }
    let(:article_comments) { create_list(:comment, 3, article_id: article.id) }
    
    it 'has 3 comments' do
      num_comments = article.comments.count
      expect(num_comments).to eq article_comments.count
    end
    
[/code]

これはエラーになると思います。というのも、最初の `num_comments` を計算している段階では、 `article_comments`
は呼び出されておらず、結果、 `num_comments` は `0` になるからです。

上記の例で言えば、 `article_comments` を `let!` 指定すると、意図通りに動くかと思います。


CC BY-SA 4.0
2020-05-07T13:03:57.103
66395
2020-05-07T13:03:57.103
754
66390
answer