Rails FactoryGirl里面的应用程序在开发环境中

时间:2016-05-01 10:03:25

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

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

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

field = <0xaaa 0xbbb>;

其中Factory not registered: order 是工厂名称。

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

规格/虚设/应用程序/ mailer_previews / MyModule的/ order_mailer_preview.rb

order

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

任何帮助都将不胜感激。

修改

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

2 个答案:

答案 0 :(得分:0)

您需要致电FactoryGirl.find_definitions加载工厂女孩进行开发。

require 'factory_girl'
FactoryGirl.find_definitions

应该做的伎俩。

答案 1 :(得分:0)

事实证明我的问题与 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之前,after代替FactoryGirl.definition_file_paths回调和自定义find_definitions定义。

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