FactoryGirl: ActiveRecord :: AssociationTypeMismatch: expected user, received # <class: 0x007>

I have a simple User model with has_many :photos association. When I try FactoryGirl.create(:user) , I get the error below. Any idea?

 # user.rb has_many :photos, dependent: :destroy # photo.rb belongs_to :user FactoryGirl.define do factory :user do email ' [email protected] ' after_build do |user| user.photos << FactoryGirl.build(:photo, user: user) end end factory :photo do photo File.new(File.join(::Rails.root.to_s, "/factories/images", "avatar1.jpg"), 'rb') end 

Error output.

 ruby-1.9.2-p290 :015 > b = FactoryGirl.create(:user) ActiveRecord::AssociationTypeMismatch: User(#70183166983920) expected, got # <Class:0x007fa995612538>(#70183166186140) from /Users/user/.rvm/gems/ [email protected] /gems/activerecord-3.2.8/lib/active_record/associations/association.rb:204:in `raise_on_type_mismatch' from /Users/user/.rvm/gems/ [email protected] /gems/activerecord-3.2.8/lib/active_record/associations/belongs_to_association.rb:6:in `replace' from /Users/user/.rvm/gems/ [email protected] /gems/activerecord-3.2.8/lib/active_record/associations/singular_association.rb:17:in `writer' from /Users/user/.rvm/gems/ [email protected] /gems/activerecord-3.2.8/lib/active_record/associations/builder/association.rb:51:in `block in define_writers' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/attribute_assigner.rb:16:in `block (2 levels) in object' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/attribute_assigner.rb:15:in `each' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/attribute_assigner.rb:15:in `block in object' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/attribute_assigner.rb:14:in `tap' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/attribute_assigner.rb:14:in `object' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/evaluation.rb:12:in `object' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/strategy/build.rb:9:in `result' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/factory.rb:42:in `run' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/factory_runner.rb:23:in `block in run' from /Users/user/.rvm/gems/ [email protected] /gems/activesupport-3.2.8/lib/active_support/notifications.rb:125:in `instrument' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/factory_runner.rb:22:in `run' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/strategy_syntax_method_registrar.rb:19:in `block in define_singular_strategy_method' ... 8 levels... from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/attribute_assigner.rb:15:in `block in object' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/attribute_assigner.rb:14:in `tap' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/attribute_assigner.rb:14:in `object' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/evaluation.rb:12:in `object' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/strategy/create.rb:9:in `result' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/factory.rb:42:in `run' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/factory_runner.rb:23:in `block in run' from /Users/user/.rvm/gems/ [email protected] /gems/activesupport-3.2.8/lib/active_support/notifications.rb:125:in `instrument' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/factory_runner.rb:22:in `run' from /Users/user/.rvm/gems/ [email protected] /gems/factory_girl-4.1.0/lib/factory_girl/strategy_syntax_method_registrar.rb:19:in `block in define_singular_strategy_method' from (irb):15 from /Users/user/.rvm/gems/ [email protected] /gems/railties-3.2.8/lib/rails/commands/console.rb:47:in `start' from /Users/user/.rvm/gems/ [email protected] /gems/railties-3.2.8/lib/rails/commands/console.rb:8:in `start' from /Users/user/.rvm/gems/ [email protected] /gems/railties-3.2.8/lib/rails/commands.rb:41:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>'ruby-1.9.2-p290 :016 > #<Class:0x007fa995612538> 
+4
source share
3 answers

solved. I should have used the newer after(:create) instead of the older after_build .

+11
source

I had a similar problem, and here I used a block of code to solve it:

 after(:create) do |user| user.photos << FactoryGirl.create :photo, user: user end 
+2
source

I had a similar problem, checking if the has_many association had at least one related model:

  class Classroom < ActiveRecord::Base # Relationships belongs_to :course has_many :weekdays # Validations validate :has_weekdays def has_weekdays errors.add(:base, 'it is invalid without at least one weekday') if self.weekdays.blank? end end 

So, to make the factory valid, here is my code

 FactoryGirl.define do factory :classroom do course after (:build) do |classroom| classroom.weekdays << FactoryGirl.create(:weekdays, classroom: classroom) end end end 
0
source

All Articles