woshidan's loose leaf

ぼんやり勉強しています

attributes_forでテスト用のハッシュを取得するときはFactoryに定義された属性しか取り出されない

下準備としてモデルのSchemeとFactoryの定義

# schema.rb
ActiveRecord::Schema.define(version: 2020_11_23_064724) do

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.integer "age"
    t.string "mail"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

end
# factories/user.rb
FactoryBot.define do
    factory :user do
        name { 'テストユーザー' }
        mail { 'test@example.com' }
        # age { 15 }
    end
end

テストでattributes_forを使ってみる

require 'rails_helper'

RSpec.describe UsersController do
  # attributes_forはおそらくコントローラのテストでパラメータの組み立てに使う
  describe 'attributes_forとbuild(:user).attributesの違い' do
    it 'attributes_forで取り出されるハッシュにはFactoryに定義した属性しか含まれない' do
      expect(attributes_for(:user)).to eq({:name=>"テストユーザー", :mail=>"test@example.com"})
      # ageやcreated_atなどの属性はFactoryに記述されていないのでattributes_forで取り出したハッシュには含まれない
    end

    it 'build(:user).attributesにはFactoryに定義した値以外も含まれる' do
      expect(build(:user).attributes).to eq({"id"=>nil, "name"=>"テストユーザー", "age"=>nil, "mail"=>"test@example.com", "created_at"=>nil, "updated_at"=>nil})
      # buildでインスタンスを作ってから、attributesメソッドで作るハッシュにはFactoryに定義されていないものもあわせて全属性が含まれている
    end
  end
end

参考

qiita.com

qiita.com