2010-02-10 18 views
19

Estoy usando el complemento factory_girl en mi aplicación de rieles. Para cada modelo, tengo un archivo Ruby correspondiente que contiene los datos de fábrica, p.Accediendo a fábricas factory_girl en * otras * fábricas

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    # t.user ??? 
end 

Tengo muchos tipos diferentes de usuarios (ya definidos en la fábrica del usuario). Si trato de la siguiente embargo:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user Factory(:valid_user) # Fails 
end 

me sale el siguiente error:

# No such factory: valid_user (ArgumentError) 

El: valid_user es realmente válida, aunque - lo puedo usar en mis pruebas - no sólo en mis fábricas. ¿Hay alguna forma de que pueda usar una fábrica definida en otro archivo aquí?

Respuesta

4

intente utilizar el método de asociación como:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.association :valid_user 
end 
+0

También puede hacer 't.association: user, factory:: valid_user' – Kris

29

Debe utilizar este código:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user { Factory(:valid_user) } 
end 

Envolver la llamada en {} provoca Factory Girl para no evaluar el código dentro de las llaves hasta se crea la fábrica: valid_thing. Esto lo obligará a esperar hasta que se haya cargado la fábrica: valid_user (Su ejemplo está fallando porque aún no se ha cargado), también causará que se cree un nuevo: valid_user para cada uno: valid_thing en lugar de tener el mismo usuario para todos : valid_thing (que es probablemente lo que quieres).

+10

Esto funciona bien. Solo sepa que la sintaxis 'Factory (: valid_user)' ha sido desaprobada; use 'FactoryGirl.create (: valid_user)' en su lugar. –

+0

Usar 'create (: valid_user)' cuando intento construir (: valid_thing) realmente creará, ¿no? ¿Hay alguna manera de hacer que este genérico de referencia sea crear/construir según el que se llame? – mpgarate

+0

@mpgarate - No, compilación no se –

3

Potencialmente una nueva característica para Factory Girl a juzgar por la edad de la pregunta, pero si el nombre de su atributo en Factory es el mismo que el de la fábrica, simplemente llamar al nombre del atributo en su fábrica poblarlo con la generación de fábrica asociada.

FactoryGirl.define do 
    factory :thing do 
    user 
    end 
end 

Esto debería dar como resultado que el campo del usuario busque una fábrica con el mismo nombre y que se ocupe de eso.

+0

Esto funcionó para mí –

Cuestiones relacionadas