如何定义在FactoryGirl工厂中使用的常规方法?例如:
FactoryGirl.define do
def silly_horse_name
verbs = %w[brunches dribbles haggles meddles]
nouns = %w[landmines hamlets vandals piglets]
"#{verbs.sample} with #{nouns.sample}".titleize
end
factory :racehorse do
name { silly_horse_name } # eg, "Brunches with Landmines"
after_build do |horse, evaluator|
puts "oh boy, I built #{silly_horse_name}!"
end
end
end
这样做根本不会调用silly_horse_name
;如果将其重新定义为raise 'hey!'
,则不会发生任何事情。
我正在使用FactoryGirl 2.5.2。
答案 0 :(得分:4)
我发现没有污染全局命名空间的最佳解决方案是在模块中定义它。如,
module FactoryHelpers
extend self
def silly_horse_name
...
end
end
FactoryGirl.define do
factory :racehorse do
name { silly_horse_name }
end
end
答案 1 :(得分:1)
我的建议是在main
上定义该方法。因此,只需将其移至FactoryGirl.define
块之外的文件顶部。
答案 2 :(得分:1)
好的,这是我的两分钱(请注意史蒂夫的回答有细微差别):
# /spec/factory_helpers.rb:
module FactoryHelpers
extend self
def silly_penguin_name # who says penguins can't be silly too?!
...
end
end
# /spec/factories.rb:
require 'factory_helpers'
FactoryGirl.define do
factory :racepenguin do
name { FactoryHelpers.silly_penguin_name }
end
end
顺便说一句,我在FactoryGirl版本4.8.0和Rails版本4.2.0。