前提
# model
class Group
has_many :users
end
class User
belongs_to :group
validates :group_id, presence: true
end
# factory
FactoryGirl.define do
factory :user do
sequence(:name) {|n| "user #{n}" }
group
end
end
問題
user_params = FactoryGirl.attributes_for(:user)
上記では、user
のgroup_id
が空になってハマりました。
原因
FactoryGirl attributes_for を読むと、明らかにassociation
を生成してない
対応
user_params = FactoryGirl.build(:user).attributes
注意
attributes
はModel
のカラム(プロパティ)なら行けますが、メソッドは対象外です。
よって、has_secure_password
機能を使っている場合は、上記だけでは、password
とpassword_confirmation
は空になってしまいます。
最終版
user = FactoryGirl.build(:user)
user_params = user.attributes.merge(password: user.password, password_confirmation: user.password_confirmation)