glebm / rails_email_preview

Preview and edit app mailer templates in Rails.

Home Page:http://glebm.github.io/rails_email_preview

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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.