Model "Factory" and factory_girl

Hi!

Another problem...

I am using a model named "Factory" since the beginning of this
project. Now I wanted to migrate my tests that depends on a manually
seeded database over to factory_girl.

In production I can still enter console or start the server, but when
trying to do anything in test-env, then I get the following
stacktrace:

/home/nmelzer/Dokumente/sources/ruby/1.9.2/rails3.1/webworld/app/models/factory.rb:1:in
`<top (required)>': Factory is not a class (TypeError)
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240:in
`require'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240:in
`block in require'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:225:in
`load_dependency'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240:in
`require'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:348:in
`require_or_load'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:302:in
`depend_on'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:214:in
`require_dependency'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/engine.rb:416:in
`block (2 levels) in eager_load!'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/engine.rb:415:in
`each'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/engine.rb:415:in
`block in eager_load!'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/engine.rb:413:in
`each'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/engine.rb:413:in
`eager_load!'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/application/finisher.rb:51:in
`block in <module:Finisher>'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/initializable.rb:25:in
`instance_exec'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/initializable.rb:25:in
`run'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/initializable.rb:50:in
`block in run_initializers'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/initializable.rb:49:in
`each'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/initializable.rb:49:in
`run_initializers'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/application.rb:92:in
`initialize!'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/railtie/configurable.rb:30:in
`method_missing'
  from /home/nmelzer/Dokumente/sources/ruby/1.9.2/rails3.1/webworld/config/environment.rb:5:in
`<top (required)>'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/application.rb:78:in
`require'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/application.rb:78:in
`require_environment!'
  from /home/nmelzer/.rvm/gems/ruby-1.9.2-p180@webworld/gems/railties-3.1.0/lib/rails/commands.rb:39:in
`<top (required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'

This looks plausible to me. Since factory_girl provides a module Factory.

But how can I avoid this problem, without completely rewriting all
code that depends on my model?

Or alternatively, are there any similar things like Factory_girl that
will not have that collision with my own code?

TIA
Norbert

But how can I avoid this problem, without completely rewriting all
code that depends on my model?

I posted this on the github site also, there I was advised to use
`::Factory` inside my code whenever I am refering my own model. Since
this is a problem that occurs only in testenv, but I have to change my
overall code, I dislike that solution, what brings me to...

Or alternatively, are there any similar things like Factory_girl that
will not have that collision with my own code?

... another gem I stumbled upon yesterday, "Fabrication"
(<http://fabricationgem.org/>). This does mostly the same as
factory_girl does, and adds some spice. It is capable of generating
cucumbersteps which makes creation of objects in my features a lot
easier, also I can use properties of the fabricated model inside of
the fabricator without to build them in a variable first (a thing I
missed in factory girl)

While I had to do following in FG

Factory.define :user do |user|
    user_name = Factory.next(:name) # Just imagine I had used
inlinesequence at this point :slight_smile:
    user.name "#{user_name}"
    user.email "#{user_name}@example.com"
    user.password "secret"
end

I can do the following in Fabricatiion:

Fabricator(:user) do
  name { sequence { |n| "User#{n}" } }
  email { |user|
"#{user.name.downcase.parameterize}@example.com" }
  password "secret"
end

This is from a privat project, where I am converting my Factorys to
Fabricators, also I converted all sequences to inline where possible
(this is something I had done with FG soon too)

I hope this one helps others too!
Bye
Norbert