En este artículo veremos cómo generar los datos para las asociaciones has_one, has_many y polimórficas usando FactoryGirl. Cada asociación será descrita con un ejemplo, para que puedas tener la idea de cómo crear fábricas más complejas sin dolor.
Generar los datos para la asociación has_one
Configurar la asociación has_one es bastante fácil, puedes definirla dentro de la fábrica. Si el nombre de la fábrica es el mismo que el de la asociación, se puede omitir el nombre de la fábrica. Por ejemplo:
FactoryBot.define do factory :story do # story attributes author endend
También se puede especificar una fábrica diferente y anular los atributos:
FactoryBot.define do factory :story do # story attributes association :author, factory: :user, first_name: "Jon" endend
Es posible especificar diferentes estrategias para crear la asociación:
association :author, factory: :user, strategy: :build
Tenga en cuenta que esto no guardará un objeto asociado en la base de datos.
Generar los datos para la asociación has_many
Generar los datos para una asociación has_many es un poco más complicado. Puedes definir una nueva fábrica y utilizar el callback after(:create) para crear una lista de asociaciones. Veamos cómo hacerlo en este ejemplo:
FactoryBot.define do # user factory without associated stories factory :user do # user attributes factory :user_with_stories do transient do stories_count 10 end after(:create) do |user, evaluator| create_list(:stories, evaluator.stories_count, user: user) end end endend
El atributo stories_count es un transitorio y está disponible en los atributos de la fábrica y en el callback a través del evaluador. Ahora, se puede crear un usuario con historias con la opción de especificar cuántas historias queremos:
create(:user_with_stories).stories.length # 10create(:user_with_stories, stories_count: 15).stories.length # 15
Tenga en cuenta que cada historia tendrá un id único, pero para que otros atributos sean únicos, es necesario generar valores diferentes para cada historia.
Puedes conseguirlo usando la secuencia como ejemplo:
FactoryBot.define do factory :story do # story attributes sequence(:title) { |n| "Title#{n}" } # Unique title for every story association :author, factory: :user, first_name: "Jon" endend
También hay una gema interesante que puede ayudarte a generar valores únicos llamada faker.
Generando los datos para asociaciones polimórficas
Una asociación polimórfica puede ser un poco confusa. Esperemos que este ejemplo te ayude a entenderlo mejor. Digamos que tienes las siguientes clases con asociaciones polimórficas:
class Profile belongs_to :profileable, polymorphic: trueendclass Account belongs_to :accountable, polymorphic: trueendclass User has_one :profile, as: :profileable has_one :account, as: :accountableend
Cuando creas las fábricas para los modelos que tienen el modelo polimórfico, simplemente creas el modelo polimórfico en un bloque after(:create) y especificas que el polimórfico es el modelo para el que está la fábrica:
FactoryBot.define do factory :user, class: User do # user attributes after(:create) do |user| create(:account, accountable: user) create(:profile, profileable: user) end endend
Y.Gracias por leer este artículo.
Si estás interesado en leer más artículos interesantes sobre Rails no dejes de suscribirte a nuestro boletín. No dejes de ver nuestra opinión sobre Rspec let vs before, Rspec Setup y FactoryGirl – create vs build vs buldstubbed.