ruby-on-rails ruby rspec factory-bot

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.