I'm trying to reuse a helper method in all my factories, however I cannot get it to work. Here's my setup:
Helper module (in 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
A factory (in 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
If I run my tests (with rake spec
), I get the following error wherever I create a user with Factory(:user)
:
Failure/Error: Factory(:user)
ArgumentError:
Not registered: random_string
What do I have to do to be able to use random_string
in my factories?
I have tried the following:
- using
include Tests::Helpers
at every level of my factory (before thedefine
, betweendefine
andfactory :user
and insidefactory :user
) - in
spec_helper.rb
, I have the following already:config.include Tests::Helpers
and it gives me access torandom_string
in my specs - simply requiring the file in my factory
I have also read the following links without success:
What about a mere:
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
Then:
FactoryGirl.define do
factory :user do
sequence(:username) { |n| "username-#{n}" }
password Tests::Helpers.random_string
password_confirmation { |u| u.password }
end
end
Ok, got it :) Do as follows:
module FactoryGirl
class DefinitionProxy
def random_string
#your code here
end
end
end
apneadiving's answer did not work for me. I had to do the following:
# /spec/support/factory_helpers.rb
module FactoryHelpers
def my_helper_method
# ...
end
end
FactoryGirl::Proxy.send(:include, FactoryHelpers)
Then you can use it as follows:
FactoryGirl.define do
factory :post do
title { my_helper_method }
end
end
I tested other answers yesterday (24.04.2012) and... none of them actually works.
Looks like Factory Girl gem (v3.2.0) have changed a lot.
But I figured out a quick solution:
# factories.rb
module FactoryMacros
def self.create_file(path)
file = File.new(path)
file.rewind
return ActionDispatch::Http::UploadedFile.new(:tempfile => file,
:filename => File.basename(file))
end
end
# also factories.rb
FactoryGirl.define do
factory :thing do |t|
t.file { FactoryMacros::create_file("path-to-file")
end
end
来源:https://stackoverflow.com/questions/7907737/how-to-include-a-module-in-a-factory-girl-factory