Acceder a fábricas factory_girl en * otras * fábricas

Estoy usando el chica_de_fabrica plugin en mi aplicación de rieles. Para cada modelo, tengo un archivo ruby ​​correspondiente que contiene los datos de fábrica, por ejemplo

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 de usuarios). Sin embargo, si intento lo siguiente:

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

Obtuve el siguiente error:

# No such factory: valid_user (ArgumentError)

Sin embargo, el: valid_user es realmente válido; puedo usarlo en mis pruebas, pero no en mis fábricas. ¿Hay alguna forma de que pueda usar una fábrica definida en otro archivo aquí?

preguntado el 09 de febrero de 10 a las 21:02

3 Respuestas

Debes usar 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 {} hace que Factory Girl no evalúe el código dentro de las llaves hasta que se cree la fábrica: valid_thing. Esto lo obligará a esperar hasta que se cargue la fábrica: valid_user (Su ejemplo falla porque aún no se ha cargado), también hará que se cree un nuevo: valid_user para cada: valid_thing en lugar de tener el mismo usuario para todos : valid_thing's (que es probablemente lo que quieres).

Respondido 10 Feb 10, 06:02

Esto funciona bien. Solo se que el Factory(:valid_user) la sintaxis ha quedado obsoleta; usar FactoryGirl.create(:valid_user) en lugar de. - erik j

Usar create(:valid_user) cuando trato de construir (: valid_thing) realmente haré una creación, ¿verdad? ¿Hay alguna manera de hacer que esta referencia sea genérica para ser creada / construida dependiendo de cuál se llame? - mpgarar

@mpgarate - No, la compilación no lo hará - B siete

La Factory(:valid_user) la sintaxis no solo está obsoleta en este momento; se ha ido totalmente ahora, sin mensaje de desaprobación Simplemente puede usar create(:valid_user), sin FactoryGirl. - Jim Stewart

Intente usar 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

Respondido 10 Feb 10, 03:02

tu tambien puedes hacer t.association :user, factory: :valid_user - Kris

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 nombre de la fábrica, simplemente llamar al nombre del atributo en su fábrica lo completará 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 de usuario busque una fábrica con el mismo nombre y la complete a partir de eso.

Respondido 26 Abr '17, 07:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.