Factory_bot: Est-il possible d'inclure un trait par défaut dans une usine ?

Créé le 22 mai 2013  ·  3Commentaires  ·  Source: thoughtbot/factory_bot

Considérez cette usine :

# Read about factories at http://github.com/thoughtbot/factory_girl

FactoryGirl.define do
  factory :follow_up do
    first_name      { Faker::Name.first_name }
    last_name       { Faker::Name.last_name }
    phone           { Faker::PhoneNumber.cell_phone.gsub(/[^\d]/, '').gsub(/^1/, '2')[0..9] }
    email           { Faker::Internet.email }
    email_preferred true
    consent         false

    trait :by_referral do
      association :hospital
      association :referral
      source { FollowUp::REFERRAL}
    end

    trait :by_provider do
      association :provider
      source { FollowUp::PROVIDER }
    end
  end
end

Je veux soit inclure par défaut le trait by_referral, soit le trait by_provider. Il ne devrait pas être valide si aucun des traits n'est inclus. Est-ce possible, ou y a-t-il une meilleure façon de le faire?

Commentaire le plus utile

Il n'y a aucun moyen direct de fermer une usine ou de forcer l'inclusion d'un trait, mais qu'en est-il de quelque chose comme ça ?

trait :follow_up_defaults do
  first_name {}
  last_name {}
  # ...
end

factory :follow_up_from_referral, class: FollowUp do
  follow_up_defaults
  hospital
  referral
  source { FollowUp::REFERRAL }
end

factory :follow_up_from_provider, class: FollowUp do
  follow_up_defaults
  provider
  source { FollowUp::PROVIDER }
end

L'autre moyen serait d'inclure un trait dans une usine par défaut :

factory :follow_up do
  first_name {}
  last_name {}
  # ...
  by_referral # <== defaults to by_referral

  trait :by_referral do
    # ...
  end

  trait :by_provider do
    # ...
  end

Le problème potentiel ici est que l'association du trait de base sera toujours incluse, même si techniquement, elle ne devrait pas l'être. La première solution (tout en étant un peu bizarre) garantit qu'un suivi tombe toujours dans l'une des deux catégories.

Faites-moi savoir si quelque chose n'est pas clair ou si vous avez d'autres idées pour résoudre ce problème !

Tous les 3 commentaires

Il n'y a aucun moyen direct de fermer une usine ou de forcer l'inclusion d'un trait, mais qu'en est-il de quelque chose comme ça ?

trait :follow_up_defaults do
  first_name {}
  last_name {}
  # ...
end

factory :follow_up_from_referral, class: FollowUp do
  follow_up_defaults
  hospital
  referral
  source { FollowUp::REFERRAL }
end

factory :follow_up_from_provider, class: FollowUp do
  follow_up_defaults
  provider
  source { FollowUp::PROVIDER }
end

L'autre moyen serait d'inclure un trait dans une usine par défaut :

factory :follow_up do
  first_name {}
  last_name {}
  # ...
  by_referral # <== defaults to by_referral

  trait :by_referral do
    # ...
  end

  trait :by_provider do
    # ...
  end

Le problème potentiel ici est que l'association du trait de base sera toujours incluse, même si techniquement, elle ne devrait pas l'être. La première solution (tout en étant un peu bizarre) garantit qu'un suivi tombe toujours dans l'une des deux catégories.

Faites-moi savoir si quelque chose n'est pas clair ou si vous avez d'autres idées pour résoudre ce problème !

Il s'avère que je peux jeter une instruction if dans une usine, donc cela fonctionne :

# Read about factories at http://github.com/thoughtbot/factory_girl

FactoryGirl.define do
  factory :follow_up do
    first_name      { Faker::Name.first_name }
    last_name       { Faker::Name.last_name }
    phone           { Faker::PhoneNumber.cell_phone.gsub(/[^\d]/, '').gsub(/^1/, '2')[0..9] }
    email           { Faker::Internet.email }
    email_preferred true
    consent         false

    if [1, 2].sample == 1
      by_referral
    else
      by_provider
    end

    trait :by_referral do
      association :hospital
      association :referral
      source { FollowUp::REFERRAL}
    end

    trait :by_provider do
      association :provider
      source { FollowUp::PROVIDER }
    end
  end
end

Merci @joshuaclayton

Au cas où quelqu'un d'autre rencontrerait le même problème que moi, vous ne pouvez pas avoir un trait par défaut qui porte le même nom qu'une usine existante. Voir https://github.com/alphagov/content-publisher/pull/1568#discussion_r362202799 pour le contexte complet.

À la place de

image

trait :image do
  # etc
end

... J'ai dû renommer en :

for_image

trait :for_image do
  # etc
end

...comme j'avais déjà une usine :image ailleurs dans le référentiel.

Cette nuance est capturée dans le guide de démarrage : "Notez que définir des traits comme attributs implicites ne fonctionnera pas si vous avez une usine ou une séquence avec le même nom que le trait" - mais il est facile de rater si vous survolez.

Cette page vous a été utile?
0 / 5 - 0 notes