はじめに
RSpecを書く時に、1対多や多対多のリレーションのテストコードを書かないといけないことがあるかと思うのですが、Qiitaや日本語のサイトにスッキリとしたいいものが掲載されていなかった(少なくともすぐには出てこなかった。たぶん。)ので今回書くことにしました。
今回は親子の親のmodelやcontrollerに記述する方法です。
子の方に記述する場合はassociationを使う方法で問題ないかと思います。
よくある書き方
before do
create_list(:(親子の子に当たるオブジェクト))
end
after(:create) do |hoge|
create_list(:hoge, 3, hoges: [hoge])
end
のようなbeforeやafterで子を呼び出して書く方法がよく見受けられました。それでやってもなんか上手くいかなかった。(これに関しては自分に原因があると考えている)
今回書く書き方
(親に当たるオブジェクト).rb
describe 'Relations' do
let!(:(親に当たるオブジェクト)) {FactoryGirl.create(:(親に当たるオブジェクト))}
before { FactoryGirl.create(:(子に当たるオブジェクト), date: '2017-11-22', (親に当たるオブジェクト): (親に当たるオブジェクト))}
it 'should have (親に当たるオブジェクト) with (子に当たるオブジェクト)' do
hoge = (親に当たるオブジェクト).(子に当たるオブジェクト).first
expect(hoge.date.to_s).to eq '2017-11-22'
end
end
これの方が書く分量もいらなくてシンプルです。また今回はcreateの前にFactoryGirlと書いていますが、
spec_helper.rb
config.include FactoryGirl::Syntax::Methods
で書く必要がなくなるので合わせて知っておくといいかと思います。