2011-03-21 2 views
1

J'ai une série de modèles pour lesquels j'ai défini des usines. J'ai aussi un modèle basé sur l'API qui sous-classe ActiveResource::Base, que je (apparemment) ne peut pas construire à partir d'une usine - Je reçois une exception lorsque Factory Girl appelle FooAPI.new. J'ai plutôt défini une classe Foo dans test/lib. Ce que je voudrais faire dans mon test est de voir si une usine existe pour un symbole donné (par exemple :foo, :bar, etc.), puis de revenir à la tentative de construire directement un objet de la classe appropriée, en utilisant String#classify.constantize. Voici mon implémentation actuelle maladroites:Puis-je demander à Factory Girl si une usine existe?

objects[name] = begin 
    klass = name.to_s.classify.constantize 
    klass.new 
    rescue 
    Factory.build name 
    end 

Je préfère quelque chose comme ceci:

Factory.exists?(name) ? Factory.build(name) : name.to_s.classify.constantize.new 

De cette façon, je me faisais une exception appropriée sur un défaut de construire un objet.

Mise à jour: Merci à fd, j'ai trouvé un moyen de le faire sans manipulation d'exception!

objects[name] = if Factory.factories.include?(name) 
    Factory.build name 
    else 
    klass = name.to_s.classify.constantize 
    klass.new 
    end 

Répondre

1

De Peeping au plus tard:

FactoryGirl.find(name) 

..should vous donner l'usine.

Cela remplace le maintenant dépréciée:

FactoryGirl.factory_by_name(name) 
+0

Hmm, qui ne semble pas fonctionner pour moi. Je reçois un 'NameError: constante non initialisée FooTest :: FactoryGirl' avec' FactoryGirl.find: foo' et une méthode 'NoMethodError: undefined' trouver 'pour Factory: Class' avec 'Factory.find: foo'. Je me demande si cela a à voir avec l'intégration de Rails? –

+0

Je ne pense pas qu'il existe en 1.3, tout ce que je vois est 'Factory.factories [nom]' comme un équivalent. Semble un peu cru, probablement supprimé dans les versions ultérieures. –

1

Après avoir pensé pendant une heure, je compris que ceci:

objects[name] = Factory.exists?(name) ? Factory.build(name) : name.to_s.classify.constantize.new 

est vraiment pas différent de ceci:

objects[name] = begin 
    Factory.build name 
rescue ArgumentError => e 
    raise unless e.message == "No such factory: #{name}" 
    name.to_s.classify.constantize.new 
end 

Donc je pense que je vais aller avec ça. :)

+0

Seul inconvénient est si ils changent le message d'erreur. Cependant, si vous n'êtes pas sur les versions ultérieures, alors les alternatives à cette approche (dans ma réponse) sont également fragiles (puisque la dernière version semble les déprécier/les supprimer.) –

7

Ce qui fonctionne dans les versions ultérieures de factorygirl est

FactoryGirl.factories.registered?(name) 
Questions connexes