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]"})