【问题标题】:Rails FactoryGirl inside app in development envRails FactoryGirl 在开发环境中的应用程序内
【发布时间】:2016-05-01 10:03:24
【问题描述】:

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

它仅在初始页面加载时有效,在重新加载/刷新页面后出现以下错误:

Factory not registered: order

其中order 是工厂名称。

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

spec/dummy/app/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::Registry:0x007ff2c9dd29d0 @name="Factory", @items={}>

【问题讨论】:

    标签: ruby-on-rails ruby factory-bot


    【解决方案1】:

    您需要致电FactoryGirl.find_definitions 来加载正在开发的工厂女孩​​。

    require 'factory_girl'
    FactoryGirl.find_definitions
    

    应该做的伎俩。

    【讨论】:

    • 我试过了,但没有运气。在初始加载后它仍然可以工作,并在重新加载时因Factory no registered 错误而中断。
    【解决方案2】:

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

    解决方案是更改我的 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 在执行find_definitions 之前回调和自定义FactoryGirl.definition_file_paths 定义而不是after

    每次我尝试使用 after 挂钩时,我都会在第一次调用时收到设计错误。

    【讨论】:

      猜你喜欢
      • 2014-11-02
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      相关资源
      最近更新 更多