Quel est le but de transient do
dans les usines FactoryBot?
J'ai vu beaucoup d'usines qui commencent par quelque chose comme ci-dessous.
factory :car do
owner nil
other_attribute nil
end
...
J'ai trouvé des informations sur ce blog: http://blog.thefrontiergroup.com.au/2014/12/using-factorygirl-easily-create-complex-data-sets-Rails/
Mais je ne comprends toujours pas comment et pourquoi le faire. Mon expérience avec FactoryBot est minime.
Quelqu'un ayant une certaine expérience de l'utilisation de FactoryBot pourrait-il partager ses idées?
Les attributs transient
vous permettent de transmettre des données qui n'est pas un attribut sur le modèle.
Supposons que vous ayez un modèle appelé car
avec les attributs suivants:
Vous souhaitez mettre en majuscule le nom de la voiture lorsque vous créez le modèle de voiture en usine. Ce que nous pouvons faire, c'est:
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
Par conséquent, chaque fois que vous créez l'usine automobile et que vous souhaitez mettre le nom en majuscule. Tu peux faire
car = FactoryGirl.create(:car, capitalize: true)
car.name
# => "JACKY"
J'espère que cela aide.
Les attributs transitoires sont essentiellement des variables locales à la fabrique qui ne persistent pas dans l'objet créé.
J'ai vu deux utilisations principales des attributs transitoires:
Vous pouvez bien sûr utiliser ces attributs transitoires pour tout ce que vous devez coder lors de la création de l'objet.
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
Cela permet à votre test d'exprimer un concept (similaire à un trait), sans rien savoir de l'implémentation:
FactoryBot.create(:car, make: 'Saturn', accident_count: 3)
FactoryBot.create(:car, make: 'Toyota', unsold: true)
OMI, je m'en tiendrai aux traits lorsqu'ils fonctionnent (par exemple invendus, ci-dessus). Mais lorsque vous devez passer une valeur non-modèle (par exemple accident_count), les attributs transitoires sont le chemin à parcourir.