2010-11-30 14 views
11

¿Hay alguna configuración en una fábrica de maquinista/chica de fábrica que lo obligue a crear objetos con el mismo nombre de fábrica solo una vez durante el caso de prueba y devolver la misma instancia todo el tiempo? Lo sé, puedo hacer algo como:fábricas Singleton en factory_girl/maquinista?

def singleton name 
    @@singletons ||= {} 
    @@singletons[name] ||= Factory name 
end 
... 
Factory.define :my_model do |m| 
    m.singleton_model { singleton :singleton_model } 
end 

pero tal vez hay una manera mejor.

Respuesta

1

No estoy seguro si esto podría ser útil para usted.

Con esta configuración, puede crear n productos utilizando la fábrica 'singleton_product'. Todos esos productos tendrán la misma plataforma (es decir, la plataforma 'FooBar').

factory :platform do 
    name 'Test Platform' 
end 

factory :product do 
    name 'Test Product' 
    platform 

    trait :singleton do 
    platform{ 
     search = Platform.find_by_name('FooBar') 
     if search.blank? 
     FactoryGirl.create(:platform, :name => 'FooBar') 
     else 
     search 
     end 
    } 
    end 

    factory :singleton_product, :traits => [:singleton] 
end 

Puede seguir utilizando la fábrica de productos estándar 'producto' para crear un producto con la plataforma 'Plataforma de Pruebas', pero se producirá un error cuando se llama a crear el segundo producto (si nombre de la plataforma está dispuesto a ser único).

+0

respuesta más detallada en este tema, incluyendo una explicación más detallada de lo anterior, además de una solución alternativa si está usando Pepino: http://stackoverflow.com/questions/2015473/using-factory-girl-in-rails-with-associations-that-have-unique-constraints-gett/8343150#8343150 –

17

Puede utilizar la macro initialize_with dentro de su fábrica y comprobar si el objeto ya existe, y luego no volver a crearlo. Esto también funciona cuando dicha fábrica está referenciado por asociaciones:

FactoryGirl.define do 
    factory :league, :aliases => [:euro_cup] do 
    id 1 
    name "European Championship" 
    owner "UEFA" 
    initialize_with { League.find_or_create_by_id(id)} 
    end 
end 

Hay una pregunta similar aquí con más alternativas: Using factory_girl in Rails with associations that have unique constraints. Getting duplicate errors

+2

Con Rails 4, querrás usar League.where (: id => id) .first_or_create - Si tienes un before_save que requiere que se establezca información, entonces puedes querer find_or_initialize_by_id o first_or_ini tializar –