ruby on rails - ¿Cuál es el propósito de un bloque ''transitorio'' en las fábricas de FactoryBot?
ruby-on-rails rspec (2)
¿Cuál es el propósito de transient do
en las fábricas de FactoryBot?
He visto muchas fábricas que comienzan con algo como abajo.
factory :car do
owner nil
other_attribute nil
end
...
He encontrado información en este blog: http://blog.thefrontiergroup.com.au/2014/12/using-factorygirl-easily-create-complex-data-sets-rails/
Pero todavía no entiendo completamente cómo y por qué hacer esto. Mi experiencia con FactoryBot es mínima.
¿Alguien con alguna experiencia en el uso de FactoryBot puede compartir alguna información?
Los atributos transitorios son esencialmente variables locales a la fábrica que no persisten en el objeto creado.
He visto dos usos principales de los atributos transitorios:
- Controlar / alterar la creación de objetos relacionados (por ejemplo, accident_count).
- Alterar los valores asignados a otras asignaciones de atributos (por ejemplo, sin vender).
Por supuesto, podría usar estos atributos transitorios para cualquier otra cosa que necesite codificar durante la creación del objeto.
factory :car do
transient do
accident_count 0
unsold false
end
owner unsold ? ''new inventory'' : nil
after(:create) do |car, evaluator|
create_list(:police_report, evaluator.accident_count, vehicle: car)
end
end
Esto permite que su prueba exprese un concepto (similar a un rasgo), sin saber nada sobre la implementación:
FactoryBot.create(:car, make: ''Saturn'', accident_count: 3)
FactoryBot.create(:car, make: ''Toyota'', unsold: true)
En mi opinión, me quedaría con los rasgos cuando funcionan (por ejemplo, no vendidos, arriba). Pero cuando necesita pasar un valor que no sea de modelo (por ejemplo, accident_count), los atributos transitorios son el camino a seguir.
transient
atributos transient
permiten pasar datos que no son un atributo en el modelo.
Digamos que tienes un modelo llamado car
con los siguientes atributos:
- nombre
- precio de compra
- modelo
Desea poner en mayúsculas el nombre del automóvil cuando cree el modelo de automóvil en la fábrica. Lo que podemos hacer es:
factory :car do
transient do
# capitalize is not an attribute of the car
capitalize false
end
name { "Jacky" }
purchase_price { 1000 }
model { "Honda" }
after(:create) do |car, evaluator|
car.name.upcase! if evaluator.capitalize
end
end
Por lo tanto, cada vez que cree la fábrica de automóviles y quiera usar mayúsculas en el nombre. Tu puedes hacer
car = FactoryGirl.create(:car, capitalize: true)
car.name
# => "JACKY"
Espero eso ayude.