Rails FactoryGirl内部应用程序在开发环境中

我正在尝试使用rails_email_preview gem在我的应用程序中使用FactoryGirl gem开发模式(它用于邮件程序测试更多 )。

它可以工作,但只在初始页面加载,重新加载/刷新页面后,我得到以下错误:

Factory not registered: order 

其中order是工厂名称。

这是我的代码(它是我的Rails引擎的虚拟应用程序):

规格/虚拟/应用/ mailer_previews / mymodule中/ order_mailer_preview.rb

 Dir[Mymodule::Core::Engine.root.join('spec', 'factories', '*')].each do |f| require_dependency f end module Mymodule class OrderMailerPreview def confirmation_email o = FactoryGirl.create(:order) OrderMailer.confirmation_email(o) end end end 

当然,我的工厂在测试环境中没有任何问题。

任何帮助,将不胜感激。

编辑:

 p FactoryGirl.factories 

返回(页面重新加载后)

 # 

您需要调用FactoryGirl.find_definitions来加载开发中的工厂女孩​​。

 require 'factory_girl' FactoryGirl.find_definitions 

应该做的伎俩。

事实certificate我的问题与Devise gem有关。 我的初始化程序中有代码,由于设计问题( 在此处描述),每次重新加载时清除工厂。 此代码仅在存在某些工厂时运行,因此不在第一个请求上运行。

解决方案是从以下位置更改我的config / initializers / devise.rb文件:

 ActionDispatch::Callbacks.after do # Reload the factories return unless (Rails.env.development? || Rails.env.test?) unless FactoryGirl.factories.blank? # first init will load factories, this should only run on subsequent reloads FactoryGirl.factories.clear FactoryGirl.find_definitions end end 

至:

 ActionDispatch::Callbacks.before do # Reload the factories return unless (Rails.env.development? || Rails.env.test?) FactoryGirl.definition_file_paths = [Mymodule::Core::Engine.root.join('spec', 'factories')] # first init will load factories, this should only run on subsequent reloads unless FactoryGirl.factories.blank? FactoryGirl.factories.clear FactoryGirl.sequences.clear FactoryGirl.find_definitions end end 

注意: before执行FactoryGirl.definition_file_paths before而不是after回调和自定义FactoryGirl.definition_file_paths定义之后。

每次我尝试使用钩子after我在第一次调用时得到Devise错误。