web-dev-qa-db-fra.com

À quoi sert un bloc «transitoire» dans les usines FactoryBot?

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?

30
tim_xyz

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:

  • nom
  • prix d'achat
  • modèle

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.

61
Sam Kah Chiin

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:

  • Contrôle/modification de la création d'objets associés (par exemple accident_count).
  • Modification des valeurs affectées à d'autres affectations d'attributs (par exemple invendus).

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.

0
David Hempy