

以下のように、user３名とその関連データを一式作りたいとします。

[code]

    before do
      user1 = create(:user)
      create(:profile, user_id: user1.id)
      create(:image, user_id: user1.id)
      create(:birthday, user_id: user1.id)
    
      user2 = create(:user)
      create(:profile, user_id: user2.id)
      create(:image, user_id: user2.id)
      create(:birthday, user_id: user2.id)
    
      user3 = create(:user)
      create(:profile, user_id: user3.id)
      create(:image, user_id: user3.id)
      create(:birthday, user_id: user3.id)
    
      create(:article, user_id: user1.id)
      create(:article, user_id: user2.id)
      create(:article, user_id: user3.id)
    end
    
[/code]

上記だと冗長なので以下のようにしたいと思いました。

[code]

    def create_user
      user = create(:user)
      create(:profile, user_id: user.id)
      create(:image, user_id: user.id)
      create(:birthday, user_id: user.id)
    end
    
    before do
      user1 = create_user
      user2 = create_user
      user3 = create_user
    
      create(:article, user_id: user1.id)
      create(:article, user_id: user2.id)
      create(:article, user_id: user3.id)
    end
    
[/code]

この`create_user`メソッドを別のファイルのspecとも共通化したいと思いました。  
rspecは`supports`というディレクトリに共通処理を書くっぽいんですが、modelでよく使われる`concerns`を使って共通化してもよいのでしょうか？


CC BY-SA 4.0
2022-03-20T07:31:00.507
87929
2022-10-17T16:04:55.753
40650
question
ruby-on-rails rspec
rspecで、factorybotで一式createするような便利メソッドを作成してファイル間で共通化したい


まず、関連するレコードを同時に作成するのは以下のように書くこともできます。

[code]

    create(:user) do |user|
      create(:profile, user_id: user.id)
      create(:image, user_id: user.id)
      create(:birthday, user_id: user.id)
    end
    
[/code]

あるいは、これらのアソシエーションが必ず必要なのであれば最初から `user` factory の方に定義しておけば `create(:user)`
だけでアソシエーションも作られます。オプショナルだがよく使うのであれば、`trait` として定義しておくとコード量が減ります。

次に、`user` factory を使ってモックを複数 `create` する場合、`create_list` という書き方が使えます。

[code]

    create_list(:user, 3)
    
[/code]

アソシエーションについて factory 側で定義したのであれば上のようなコードだけで済みますし、ブロックを使うことにしたのであれば
`create_list` もブロックを受け付けるので似たような形で記述できます。

これらのテクニックを使うと、メソッドを定義するまでもなくコード量が減るかなと思います。

Factorybot の便利な機能は GETTING_STARTED によくまとまっているので一読しておくと便利です。
<https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md>


CC BY-SA 4.0
2022-03-20T10:13:10.610
87932
2022-03-20T10:13:10.610
19110
87929
answer