LoginSignup
8
5

More than 5 years have passed since last update.

RSpecの1対多をスッキリ書く方法

Last updated at Posted at 2017-11-29

はじめに

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

で書く必要がなくなるので合わせて知っておくといいかと思います。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5