2012-08-01 11 views
8

¿Cómo puedo definir un método normal para usar en una de mis fábricas FactoryGirl? Por ejemplo:¿Cómo puedo definir un método en una fábrica de 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 

Hacerlo de esta manera no llama silly_horse_name en absoluto; si se redefine a raise 'hey!', no ocurre nada.

Estoy usando FactoryGirl 2.5.2.

Respuesta

1

Mi sugerencia sería definir ese método en main. Así que simplemente muévelo a la parte superior de su archivo fuera del bloque FactoryGirl.define.

+0

Eso funciona. Va al espacio de nombres global, pero solo está definido en el entorno de prueba, y si el nombre es lo suficientemente único, puede no importar. –

+1

No me gusta esta solución en absoluto, pero probé y no pude encontrar otra solución. Lo que más me confunde es que [la documentación de FG] (https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#callbacks) implica que esto es posible usando este ejemplo: 'after (: build) {| usuario | do_something_to (user)} ' –

4

La mejor solución que pude encontrar que no contaminó el espacio de nombres global fue definirla en un módulo. Por ejemplo,

module FactoryHelpers 
    extend self 

    def silly_horse_name 
    ... 
    end 
end 

FactoryGirl.define do 
    factory :racehorse do 
    name { silly_horse_name } 
    end 
end 

Source

+4

¿Tiene que incluir el módulo' FactoryHelpers' en la fábrica de alguna manera? Usando lo anterior, veo 'método no definido silly_horse_name para # ' – robd

1

OK, aquí está mi granito de arena (tenga en cuenta que existen diferencias sutiles en la respuesta de Steve):

# /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 

Por cierto, Estoy en FactoryGirl versión 4.8.0 y Rails versión 4.2.0.

Cuestiones relacionadas