rspecのテスト環境で多対多のアソシエーションを一括生成する方法 +α

# やりたいこと
RSpecのテストの中で使える、多対多の関係を一括生成する

今回は
***【 user -- group_user(中間テーブル) -- group 】***
という関係を、userから一括生成します。

# 使っているgem
```ruby
gem 'rspec-rails'
gem 'factory_girl_rails'
gem 'faker'
```
FakerとFactoryGirlを使ってデータを作成します。
その作成するときの方法でアソシエーションを組む感じです。

# 実装
コードはこんな感じです。

```ruby:spec/factories/user.rb
FactoryGirl.define do
  pass = Faker::Internet.password(8)

  factory :user do
    name                  Faker::Name.name
    email                 Faker::Internet.email
    password              pass
    password_confirmation pass

    after(:create) do |user|
      create(:group_user, user: user, group: create(:group))
    end
  end
end
```

```ruby:spec/factories/group.rb
FactoryGirl.define do
  factory :group do
    name
    created_at { Faker::Time.between(5.days.ago, 3.days.ago, :all) }
    updated_at { Faker::Time.between(2.days.ago, 1.days.ago, :all) }
  end
end
```

```ruby:spec/factories/group_user.rb
FactoryGirl.define do
  factory :group_user do
    user
    group
  end
end
```

# コード全体の流れ
### ポイント
***【中間テーブルgroup_userに引数としてuser、groupを渡すとアソシエーションできる】***

userがcreateされる
↓
after内の記述が動く
↓
group_userが生成されそうになる
↓
group_userのパラメータとしてgroupが生成される
↓
user, groupが引数として入り、group_userが生成される

結果：
user, group, group_userが生成されて、
***【 user -- group_user -- group 】***のアソシエーションが組まれる。


# 実際にどう使えるか

### やること

message_controllerの```@groups = current_user.groups```という記述で、@groupsが設定した値になるかどうかをテストします。

```ruby:message_controller.rb
class MessagesController < ApplicationController
  before_action :authenticate_user!

  def index
    @groups = current_user.groups
  end
end
```

### コードの流れ
letの部分でuserをcreate(一括でgroup, group_userもcreate&アソシエーション)
↓
before do でログイン(テスト内でのdeviseログインについては[こちら](http://qiita.com/Kohei_Kishimoto0214/items/e29e509b12a6eb484a42))
↓
params[:group_id]を得るために、@groupを定義し、@group.idとする。
（これはrootingが```/groups/:group_id/messages messages#index```となっているため）
↓
アソシエーションを利用しgroupsを定義(```groups = user.groups```)
↓
@groupsと定義したgroupsの比較
(```assigns(:groups)```は@groupsを意味し、```.to eq groups```のgroupsは直前に定義したもの。この2つがeqなことを確かめている。）

```ruby:message_controller_spec.rb
require 'rails_helper'

describe MessagesController, type: :controller do
  let(:user) { create(:user) }

  describe 'GET #index' do
    before do
      login_user user
    end

    it "assigns the requested contact to @groups" do
      @group = user.groups.first
      get :index, params: { group_id: @group.id }
      groups = user.groups
      expect(assigns(:groups)).to eq groups
    end
end
```


# 【+α】 groupとuserにbelongs_toなmessageを、さらに一括で生成する
### やりたいこと
userを生成した時に、group_user、groupを一括生成、アソシエーションしつつ、
group, userとアソシエーションしたmessageを生成したい。

```ruby:message.rb
class Message < ApplicationRecord
  belongs_to :user
  belongs_to :group
end
```

先に```temp_group = create(:group)```などとして
それを引数としてmessage, group_userに渡してやればできました。

```ruby:user.rb
FactoryGirl.define do
  pass = Faker::Internet.password(8)

  factory :user do
    name                  Faker::Name.name
    email                 Faker::Internet.email
    password              pass
    password_confirmation pass

    after(:create) do |user|
      temp_group = create(:group)
      # ここでgroupをcreateしてtemp_groupに入れる
      create(:message, user: user, group: temp_group)
      create(:group_user, user: user, group: temp_group)
    end
  end
end
```

##番外編；最近買った、面白いもの
[・ハンターハンター34巻（6/29）](http://amzn.to/2u6iUc4)
クロロ VS ヒソカとか、どうやっても面白くなるとしか
[・カーテン自動開閉ロボット](http://amzn.to/2u6LHwS)
カーテンレールに付ける4000円のロボット。
これを付けてから目覚ましなしで起きられる率が上がった。
[・衛藤美彩 写真集](http://amzn.to/2tcFfIz)
「綺麗なお姉さん」が好きな人、ちょっと眺めてるだけで幸せになれますよ。


## 参考サイト様
- [factory_girl で最低限知っておきたい4つの使い方](http://blog.livedoor.jp/sasata299/archives/51931175.html)
- [FactoryGirlで多対多の関連データを一緒に生成する](http://totutotu.hatenablog.com/entry/2015/09/09/FactoryGirl%E3%81%A7%E5%A4%9A%E5%AF%BE%E5%A4%9A%E3%81%AE%E9%96%A2%E9%80%A3fixture%E3%82%92%E5%85%A8%E9%83%A8%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B)
- [FactoryGirlのアソシエーションの使い方を確認する](http://woshidan.hatenablog.com/entry/2014/09/06/194843)
- [FactoryGirlで関連データを同時に生成する方法いろいろ](http://qiita.com/metheglin/items/47116ccbdb26aa00e034)
- [RSpecにおけるFactoryGirlの使い方まとめ](http://qiita.com/muran001/items/436fd07eba1db18ed622)