如何在factory_girl工厂中包含一个模块?

mbi*_*ard 15 module ruby-on-rails mixins factory-bot

我正在尝试在我的所有工厂中重用一个辅助方法,但是我无法让它工作.这是我的设置:

辅助模块(在spec/support/test_helpers.rb中)

module Tests
  module Helpers
    # not guaranteed to be unique, useful for generating passwords
    def random_string(length = 20)
      chars = ['A'..'Z', 'a'..'z', '0'..'9'].map{|r|r.to_a}.flatten
      (0...length).map{ chars[rand(chars.size)] }.join
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

工厂(在spec/factories/users.rb中)

FactoryGirl.define do
  factory :user do
    sequence(:username) { |n| "username-#{n}" }
    password random_string
    password_confirmation { |u| u.password }
  end
end
Run Code Online (Sandbox Code Playgroud)

如果我运行我的测试(with rake spec),无论我在哪里创建用户,都会收到以下错误Factory(:user):

 Failure/Error: Factory(:user)
 ArgumentError:
   Not registered: random_string
Run Code Online (Sandbox Code Playgroud)

为了能够random_string在我的工厂使用,我该怎么办?

我尝试过以下方法:

  • 使用include Tests::Helpers我厂的每一级(前define,之间define以及factory :user和内部factory :user)
  • 在spec_helper.rb,我已经有以下内容:config.include Tests::Helpers它让我可以访问random_string我的规格
  • 只需要我工厂的文件

我还阅读了以下链接但没有成功:

apn*_*ing 11

仅仅是:

module Tests
  module Helpers
    # not guaranteed to be unique, useful for generating passwords
    def self.random_string(length = 20)
      chars = ['A'..'Z', 'a'..'z', '0'..'9'].map{|r|r.to_a}.flatten
      (0...length).map{ chars[rand(chars.size)] }.join
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后:

FactoryGirl.define do
  factory :user do
    sequence(:username) { |n| "username-#{n}" }
    password Tests::Helpers.random_string
    password_confirmation { |u| u.password }
  end
end
Run Code Online (Sandbox Code Playgroud)

好的,明白了:)做如下:

module FactoryGirl
  class DefinitionProxy
    def random_string
     #your code here
    end
  end
end
Run Code Online (Sandbox Code Playgroud)


小智 6

apneadiving的答案对我不起作用.我必须做以下事情:

# /spec/support/factory_helpers.rb
module FactoryHelpers
  def my_helper_method
    # ...
  end
end

FactoryGirl::Proxy.send(:include, FactoryHelpers)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它如下:

FactoryGirl.define do
  factory :post do
    title { my_helper_method }
  end
end
Run Code Online (Sandbox Code Playgroud)

  • FG v4不再使用:: Proxy了 - fwiw,你可以通过用'FactoryGirl :: SyntaxRunner.send'替换@cuvius回答中的`FactoryGirl :: Proxy.send`来获得相同的效果.但请注意,gem的开发人员是[思考]在宝石本身的适当解决方案](https://github.com/thoughtbot/factory_girl/issues/564),所以如果你这样做,也要跟踪这些发展. (8认同)