unidos famosos estadounidense estados directores director cine actuales ruby-on-rails factory-bot

ruby-on-rails - estadounidense - directores de cine famosos actuales



¿Cómo crear/construir múltiples instancias de una fábrica en Factory Girl? (4)

Con el factory_girl_rails 4.6.0 actual tuve el problema de alguna manera relacionado que build(:model) devolvió siempre la misma instancia del objeto. Usar sequence(:name) ... no solucionó eso. Así que generé algunos rasgos falsos (vacíos) como este:

FactoryGirl.define do factory :model do ... # fake traits to urge factory_girl to always return a new instance: (1..5).each {|n| trait "var#{n}".to_sym } end end

Y luego llamando a build(:model, :var1), build(:model, :var2)...

¿Cómo creo varios registros o varias fábricas de la misma clase?

Lo intenté:

Factory.define :user do |user| user.email "[email protected]" user.password "somepassword" user.email "[email protected]" user.password "somepassword" end

y

Factory.define :user do |user| user.email "[email protected]" user.password "somepassword" end Factory.define :user do |user| user.email "[email protected]" user.password "somepassword" end

Pero no funciona - Attribute already defined: email .


Esta es una pregunta y respuesta más antigua, pero fue el primer resultado que encontré en Google, así que pensé que agregaría lo siguiente de los docs bajo el encabezado Creación o creación de registros múltiples :

created_users = FactoryGirl.create_list(:user, 25) #creates 25 users twenty_year_olds = FactoryGirl.build_list(:user, 25, date_of_birth: 20.years.ago) #builds 25 users, sets their date_of_birth

En el ejemplo que acabo de citar, cada usuario tendría un nombre de usuario diferente, siempre que esa sequence se use en la definición de fábrica (consulte la respuesta de Mike Lewis más arriba).


Hay dos pasos para usar Fábricas, el primero es definirlos y el segundo es usarlos.

1) Definirlos:

Factory.define :user do |u| u.sequence(:email) { |n| "mike#{n}@awesome.com"} u.password "password123" end

2) Usándolos:

Un ejemplo sería usarlos en una especificación:

@user1 = Factory(:user) #has an email of [email protected] @user2 = Factory(:user) # has an email of [email protected] due to sequences in FG

Me gustaría ver este Railscast para tener una mejor sensación de ello.


Hay un par de opciones si desea que los registros de la misma fábrica (base) tengan valores diferentes.

A) Anular atributos definidos

factory :post, aliases: [:approved_post] do title "A title" approved true end approved_post = create(:approved_post) unapproved_post = create(:post, approved: false)

B) Herencia

factory :post do title "A title" factory :approved_post do approved true end factory :unapproved_post do approved false end end approved_post = create(:approved_post) unapproved_post = create(:unapproved_post)

C) Secuencias

factory :user do sequence(:email, 1000) { |n| "person#{n}@example.com" } end

D) Rasgos

factory :post do title "My awesome title" trait(:approved) { approved true } trait(:unapproved) { approved false } trait :with_comments do after(:create) do |instance| create_list :comment, 2, post: instance end end factory :approved_post_with_comments, traits: [:approved, :with_comments] end approved_post_with_comments = create(:approved_post_with_comments) unapproved_post_with_no_comments = create(:post, :unapproved, title: "Test") post_with_title = build(:post)

Estos métodos se pueden combinar. Este ejemplo utiliza listas y pares con secuencias y anulación.

factory :user do sequence(:username) { |n| "user#{n}" } date_of_birth Date.today end # Build a pair and a list of users. two_newborns = build_pair(:user) ten_young_adults = build_list(:user, 10, date_of_birth: 20.years.ago) # Create a pair and a list of users. two_young_adults = create_pair(:user, date_of_birth: 20.years.ago) ten_newborns = create_list(:user, 10)

Prefiero usar rasgos siempre que sea posible, los encuentro flexibles.