tutorial rails girl factorybot bot ruby rspec associations factory-bot

ruby - rails - FactoryGirl anula el atributo del objeto asociado



rspec factory bot (3)

Creo que puedes hacer que esto funcione con callbacks y atributos transitorios. Si modifica su fábrica de perfiles, haga lo siguiente:

FactoryGirl.define do factory :profile do user ignore do user_email nil # by default, we''ll use the value from the user factory end title "director" bio "I am very good at things" linked_in "http://my.linkedin.profile.com" website "www.mysite.com" city "London" after(:create) do |profile, evaluator| # update the user email if we specified a value in the invocation profile.user.email = evaluator.user_email unless evaluator.user_email.nil? end end end

entonces deberías poder invocarlo así y obtener el resultado deseado:

p = FactoryGirl.create(:profile, user_email: "[email protected]")

No lo he probado, sin embargo.

Esto es probablemente simple pero no puedo encontrar un ejemplo en ninguna parte.

Tengo dos fábricas:

FactoryGirl.define do factory :profile do user title "director" bio "I am very good at things" linked_in "http://my.linkedin.profile.com" website "www.mysite.com" city "London" end end FactoryGirl.define do factory :user do |u| u.first_name {Faker::Name.first_name} u.last_name {Faker::Name.last_name} company ''National Stock Exchange'' u.email {Faker::Internet.email} end end

Lo que quiero hacer es anular algunos de los atributos del usuario cuando creo un perfil:

p = FactoryGirl.create(:profile, user: {email: "[email protected]"})

o algo similar, pero no puedo obtener la sintaxis correcta. Error:

ActiveRecord::AssociationTypeMismatch: User(#70239688060520) expected, got Hash(#70239631338900)

Sé que puedo hacer esto creando primero al usuario y luego asociándolo con el perfil, pero pensé que debía haber una forma mejor.

O esto funcionará:

p = FactoryGirl.create(:profile, user: FactoryGirl.create(:user, email: "[email protected]"))

pero esto parece demasiado complejo. ¿No hay una manera más simple de anular un atributo asociado? ¿Cuál es la sintaxis correcta para esto?


Lo resolvió creando Usuario primero y luego Perfil:

my_user = FactoryGirl.create(:user, user_email: "[email protected]") my_profile = FactoryGirl.create(:profile, user: my_user.id)

Entonces, esto es casi lo mismo que en la pregunta, dividido en dos líneas. La única diferencia real es el acceso explícito a ".id". Probado con Rails 5.


De acuerdo con uno de los creadores de FactoryGirl, no se pueden pasar argumentos dinámicos a la asociación helper ( Pase el parámetro en el atributo de configuración en la asociación en FactoryGirl ).

Sin embargo, deberías poder hacer algo como esto:

FactoryGirl.define do factory :profile do transient do user_args nil end user { build(:user, user_args) } after(:create) do |profile| profile.user.save! end end end

Entonces puedes llamarlo casi como quisieras:

p = FactoryGirl.create(:profile, user_args: {email: "[email protected]"})