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
東京在住の30歳。元々は車部品メーカーで働いていてましたが、プログラミングに興味を持ちスクールに通ってエンジニアになりました。 そこからベンチャー → メガベンチャー → 個人事業主になりました。 最近は生成 AI 関連の業務を中心にやっています。 ヒカルチャンネル(Youtube)とワンピースが大好きです!