FactoryGirl usage
jmarceli opened this issue · comments
Is it possible to mock data using FactoryGirl?
It will be very useful feature as if you use it for tests you probably have all factories ready.
I've tried to use it as follow:
spec/dummy/app/mailer_previews/mynamespace/order_mailer_preview.rb
FactoryGirl.definition_file_paths = Dir[Mynamespace::Core::Engine.root.join('spec/factories/*.rb')]
FactoryGirl.definition_file_paths += [Mynamespace::Core::Engine.root.join('spec/factories.rb')]
FactoryGirl.find_definitions
module Mynamespace
class OrderMailerPreview
def confirmation_email
OrderMailer.confirmation_email(FactoryGirl.build(:order))
end
end
end
But I'm getting Factory not registered: order
error.
What is strange my FactoryGirl.find_definitions
returns correct file set:
>> FactoryGirl.find_definitions
=> ["/Users/user/Work/mynamespace/backend/base/core/spec/factories/item_factory.rb", "/Users/user/Work/mynamespace/backend/base/core/spec/factories/material_factory.rb", "/Users/user/Work/mynamespace/backend/base/core/spec/factories/order_factory.rb", "/Users/user/Work/mynamespace/backend/base/core/spec/factories/order_history_factory.rb", "/Users/user/Work/mynamespace/backend/base/core/spec/factories/permission_factory.rb", "/Users/user/Work/mynamespace/backend/base/core/spec/factories/role_factory.rb", "/Users/user/Work/mynamespace/backend/base/core/spec/factories/status_factory.rb", "/Users/user/Work/mynamespace/backend/base/core/spec/factories/user_factory.rb", "/Users/user/Work/mynamespace/backend/base/core/spec/factories.rb"]
Requiring factory_girl_rails
and spec/factories
should be sufficient. E.g. https://github.com/thredded/thredded/blob/master/db/seeds.rb
Thanks for the fast reply. It should work like you described but it doesn't.
Maybe the problem is that I write rails engine not rails application, so factories are defined inside engine spec/factories
and mailer previews are inside dummy app for this engine spec/dummy/app/mailer_previews
.
I manage to get somewhere when I change my preview file to:
spec/dummy/app/mailer_previews/mynamespace/order_mailer_preview.rb
require 'factory_girl_rails'
require '../factories'
Dir["../factories/*"].each { |f| require f }
#p FactoryGirl.factories # prints out all registered factories
module Mynamespace
class OrderMailerPreview
def confirmation_email
order = FactoryGirl.build(:order, :with_items)
OrderMailer.confirmation_email(order)
end
end
end
But I works only on first page view! After page reload my factories get unregistered (line p FactoryGirl.factories
returns empty array) and I have to reload rails server.
Use require_dependency
instead of require for autoloading to work.
I've "upgraded" my requires to:
Dir[Mynamespace::Core::Engine.root.join('spec', 'factories', '*')].each do |f|
require_dependency f
end
But I'm still getting Factory not registered: order
after page refresh and success on initial load.
It might be my fault so I close the issue. For anyone interested I've created SO topic http://stackoverflow.com/questions/36965377/rails-factorygirl-inside-app-in-development-env where I post an answer if I'll ever find one.
Resolved at least for now. Solution described at SO, it was Devise related issue.