Factory Girl, Spork and Cucumber - duplicate model classes

I am having a strange problem with FactoryGirl, Spork and Cucumber.
It seems to be happening when on a ‘before_validation’ hook another
model object is created and saved.

Below is a cut down version of the model in question. When it is
created via FactoryGirl, I get this error:

Country(#28734490) expected, got Country(#28417320)
(ActiveRecord::AssociationTypeMismatch)

class TuteonParent < ActiveRecord::Base

has_one :address, :as => :addressable
has_one :fs_parent_profile

accepts_nested_attributes_for :fs_parent_profile, :address

validates_presence_of :address
validates_associated :address

validates_presence_of :core_profile
validates_associated :core_profile

validates_presence_of :fs_parent_profile
validates_associated :fs_parent_profile

before_validation :create_fs_parent_profile

def create_fs_parent_profile

fs_parent_profile = FsParentProfile.new(
  :state => address.country.name,
  :curriculum_state => address.country.name,
  :country => address.country,
  :fs_curriculum_country =>

FsCurriculumCountry.find_by_country_id(address.country.id)
)

self.fs_parent_profile = fs_parent_profile

end

… and the simplified Factory definition is as follows:

Factory.define :valid_parent, :class => Parent do |p|

tp.address { Factory.create(:address) }

end

If anyone can shed some light on this would be much appreciated!
Thank you

Adam

I forgot to add -

this is only an issue with Spork and Cucumber. Rspec and Spork run
fine, and before I got Spork working (I think) this was working with
Cucumber.
I think it may have something to do with where I am loading the
Factories or “require ‘factory_girl’”

I tried to copy the layout from the RSpec spec_helper.rb. This is how
my features/support/env.rb looks like:

require ‘rubygems’
require ‘spork’

Spork.prefork do

ENV[“RAILS_ENV”] ||= “test”
require File.expand_path(File.dirname(FILE) + ‘/…/…/config/
environment’)

require ‘cucumber/formatter/unicode’ # Remove this line if you don’t
want Cucumber Unicode support
require ‘cucumber/rails/world’
require ‘cucumber/rails/active_record’
require ‘cucumber/web/tableish’

require ‘capybara/rails’
require ‘capybara/cucumber’
require ‘capybara/session’

require ‘factory_girl’

Capybara.default_selector = :css

ActionController::Base.allow_rescue = false
Cucumber::Rails::World.use_transactional_fixtures = true
if defined?(ActiveRecord::Base)
begin
require ‘database_cleaner’
DatabaseCleaner.strategy = :truncation
rescue LoadError => ignore_if_database_cleaner_not_present
end
end

end

Spork.each_run do
require ‘factory_girl_rails’
Dir.glob(File.join(File.dirname(FILE), ‘…/…/spec/factories/
*.rb’)).each {|f| require f }
end

OK - solved this issue finally.

I used ‘find’ instead of the association:

def create_fs_parent_profile
self.fs_parent_profile = FsParentProfile.new(
:state => address.country.name,
:curriculum_state => address.country.name,
:country => Country.find(address.country.id),
:fs_curriculum_country =>
FsCurriculumCountry.find_by_country_id(address.country.id)
)

I’m experiencing the exact same problem Adam. I haven’t been able to
figure out what is causing it either…

Jeff Bigler wrote in post #983094:

I’m experiencing the exact same problem Adam. I haven’t been able to
figure out what is causing it either…

I have returned to the project in question and still having problems
with this… anyone know if this issue has been address yet?

Thank you

well, I kinda feel like I am talking to myself here… but although
solving this issue in one part of my app tests, it has come up in
another:

I have a couple of Factories defined -

Factory.define :valid_student, :class => Student do |s|

s.email { “#{Factory.next(:name)}@example.com” }
s.gender ‘female’
s.date_of_birth { Factory.next(:dob) }
s.current_school { Factory.next(:school) }
s.current_school_year 10
s.core_profile { Factory.create(:student_profile) } # <---- this is
causing an error
s.parent { Factory.create(:valid_parent, :tc_check => “1”) }

end

Factory.define :student_profile, :class => CoreProfile do |cp|
cp.first_name ‘Kelly’
cp.last_name ‘Hope’
cp.user_name { Factory.next(:user_name) }
cp.password ‘password’
cp.password_confirmation ‘password’
end

class Student < ActiveRecord::Base

has_one :core_profile, :as => :core_profileable
accepts_nested_attributes_for :core_profile

after_initialize :build_associations

def build_associations
build_core_profile unless core_profile
end

end

The error is similar:
CoreProfile(#26997920) expected, got CoreProfile(#29695630)
(ActiveRecord::AssociationTypeMismatch)

Any tips on this would be received with much gratitude!

Thanks
Adam

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs