今日は小ネタで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>
まとめ
テスト数が多くなってくるとこういうことの積み重ねで徐々に改善していくものだと思うので、普段の業務でも意識できるようしていきたいと思いました。
ここまで呼んでくださりありがとうございました。