Ruby on Rails

【RSpec】buildとbuild_stubbedのちがい

今日は小ネタでbuildとbuild_stubbedメソッドのちがいについて調べてみたので書いていこうと思います。今回の記事はFactoryBotを使っていること前提とします。

どういうときに使うのか

どちらもデータベースに保存せずにインスタンスを作成するメソッドです。下の例のようにデータベースに保存する必要がない場合に使います。

RSpec.describe User, type: :model do
  describe '#fullname' do
    let!(:user) { create :user, first_name: 'Shun', last_name: 'Sakai' }

    it 'return full name' do
      expect(user.fullname).to eq Shun Sakai'
    end
  end
end
RSpec.describe User, type: :model do
  describe '#fullname' do
    let!(:user) { build :user, first_name: 'Shun', last_name: 'Sakai' }
    let!(:user) { build_stubbed :user, first_name: 'Shun', last_name: 'Sakai' } # 両者のちがいは後に記述

    it 'return full name' do
      expect(user.fullname).to eq Shun Sakai'
    end
  end
end

buildメソッドとbuild_stubbedメソッドのちがい

buildメソッドはUser.newと同じ動作をするのに対して、build_stubbedメソッドはその名の通りスタブを作ります。idが1001となっていて、created_atやupdated_atカラムに値が入っているのが違いますね。文字通りスタブを作っていることが分かるかと思います。

User.build
=> #<User id: nil, last_name: "Sakai", first_name: "Shun", created_at: nil, updated_at: nill>
User.build_stubbed
=> #<User id: 1001, last_name: "Sakai", first_name: "Shun", created_at: "2021-09-04 07:19:01", updated_at: "2021-09-04 07:19:01">

ちなみにユーザにアソシエーションが張られていた場合、そのインスタンスもきちんと作られます。

FactoryBot.define do
  factory :user do
    first_name { 'Shun' }
    last_name { 'Sakai' }
    association :company
  end
end

user = User.build
user.company
=> #<Company:0x00007facbd34ab18 id: nil, name: "株式会社A", created_at: nil, updated_at: nil>
user = User.build_stubbed
user.company
=> #<Company:0x00007facbd34ab18 id: 1001, name: "株式会社A", created_at: 2021-09-04 07:19:05, updated_at: 2021-09-04 07:19:05>

まとめ

テスト数が多くなってくるとこういうことの積み重ねで徐々に改善していくものだと思うので、普段の業務でも意識できるようしていきたいと思いました。

ここまで呼んでくださりありがとうございました。

ABOUT ME
sakai
三重出身の28歳。前職はメーカーで働いていて、プログラミングスクールに通って未経験からWeb業界に転職しました。Railsをメインで使っていて、AWSも少しできます。音楽を聞くこととYoutubeを見るのが好きです。最近はへきトラ劇場にハマってます