tutorial rails factorybot example create bot ruby-on-rails tdd factory factory-bot

ruby on rails - rails - Acceso a las fábricas de factory_girl en*otras*fábricas



factorybot gem (3)

Estoy usando el plugin factory_girl 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). Si intento lo siguiente sin embargo:

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)

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


Deberías usar este código:

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

El ajuste de la llamada en {} hace que Factory Girl no evalúe el código dentro de las llaves hasta que 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 todavía no está cargado), también causará 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).


Intenta 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


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

FactoryGirl.define do factory :thing do user end end

Esto debería hacer que el campo de usuario busque una fábrica con el mismo nombre y la rellene con eso.