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

```

    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
    
```

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

```

    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
    
```

この`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するような便利メソッドを作成してファイル間で共通化したい
まず、関連するレコードを同時に作成するのは以下のように書くこともできます。

```

    create(:user) do |user|
      create(:profile, user_id: user.id)
      create(:image, user_id: user.id)
      create(:birthday, user_id: user.id)
    end
    
```

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

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

```

    create_list(:user, 3)
    
```

アソシエーションについて 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