2010-02-10 5 views
19

J'utilise le plug-in factory_girl dans mon application rails. Pour chaque modèle, j'ai un fichier ruby ​​correspondant contenant les données d'usine par ex.Accès aux usines factory_girl dans les * autres * usines

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    # t.user ??? 
end 

J'ai beaucoup de différents types d'utilisateurs (déjà définis dans la fabrique de l'utilisateur). Si je effectuez les opérations suivantes si:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user Factory(:valid_user) # Fails 
end 

Je reçois l'erreur suivante:

# No such factory: valid_user (ArgumentError) 

Le: valid_user est en fait valable si - je peux l'utiliser dans mes tests - tout simplement pas dans mes usines. Est-il possible que je puisse utiliser une usine définie dans un autre fichier ici?

Répondre

4

Essayez d'utiliser la méthode d'association comme:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.association :valid_user 
end 
+0

Vous pouvez également faire 't.association: user, factory:: valid_user' – Kris

29

Vous devez utiliser ce code:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user { Factory(:valid_user) } 
end 

Envelopper l'appel {} provoque Factory Girl de ne pas évaluer le code à l'intérieur des accolades jusqu'à ce que l'usine: valid_thing est créée. Cela le forcera à attendre que le fichier: valid_user factory ait été chargé (Votre exemple échoue car il n'est pas encore chargé), cela entraînera également la création d'un nouvel utilisateur: valid_user pour chaque: valid_thing plutôt que d'avoir le même utilisateur pour tous : valid_thing's (Ce qui est probablement ce que vous voulez).

+10

Cela fonctionne bien. Sachez simplement que la syntaxe 'Factory (: valid_user)' a été dépréciée; utilisez 'FactoryGirl.create (: valid_user)' à la place. –

+0

L'utilisation de 'create (: valid_user)' quand j'essaye de construire (: valid_thing) va en fait créer une création, non? Y at-il un moyen de rendre cette référence générique à créer/construire en fonction de ce qui est appelé? – mpgarate

+0

@mpgarate - Non, build ne va pas –

3

Potentiellement une nouvelle fonctionnalité de Factory Girl en fonction de l'âge de la question, mais si le nom de votre attribut dans l'Usine est le même que le nom de l'usine, il suffira d'appeler le nom de l'attribut dans votre usine. le peupler avec la génération d'usine associée.

FactoryGirl.define do 
    factory :thing do 
    user 
    end 
end 

Cela devrait permettre au champ utilisateur de rechercher une usine portant le même nom et de la remplir.

+0

Cela a fonctionné pour moi –

Questions connexes