2012-01-06 5 views
2

Ce dont j'ai besoin, c'est d'un moyen dans un bloc Factory.define de savoir si l'usine a été appelée en utilisant create ou build, explicitement ou simplement en utilisant la stratégie par défaut.Factory Girl: création vs construction, comportement différent

J'ai une usine qui doit ajuster manuellement les associations que l'auteur original du code a prises si loin des rails que les barfs de création normale et la construction normale peuvent être gérées. Je ne veux pas ajuster ces associations dans le cas de build, mais je dois dans le cas de créer.

J'ai cherché à voir s'il y a quelque chose d'analogue à 'current_strategy' mais je n'ai encore rien vu. Je sais que je peux distinguer using after_create vs after_build, mais l'auteur original a fait en sorte que le fait d'enregistrer l'objet sans faire les ajustements provoque un grand malheur - sauvegarder les exceptions et les ordures dans la base de données. Je n'ai actuellement aucun mandat pour réparer les "modèles" qu'il a écrits et les tests rspec existants utilisent la différenciation pour faire la bonne chose à tout moment. Dans tous les cas, les auteurs des tests antérieurs ont choisi de ne jamais utiliser create, ce qui signifie que la configuration de la plupart des données de test est un processus ardu et long.

Toute aide serait grandement appréciée - je toujours mon exercice GoogleFu mais aimerait être court-circuitée ...

Oh, cela est dans Rails 2 (/ pleurer)

merci!

Répondre

1

Cela ressemble vraiment à un problème très étrange, mais puisque vous dites que vous nettoyez le code de quelqu'un d'autre, je suppose qu'il n'y a pas de solution facile.

Je ne voudrais pas approcher cela du côté de l'usine. L'usine ne devrait pas s'en soucier car le modèle (pas l'usine) est censé être le gardien de la validité en termes de structure d'objet et d'associations.

Je voudrais écrire les spécifications que séparément create et build objets et tester leurs associations pour vous assurer qu'ils sont corrects (selon ce que vous voulez que le nouveau comportement être en fin de compte). Ensuite, obtenez ces spécifications à passer en refactorisant les modèles pour faire ce que vous avez réellement besoin de faire. C'est ainsi que vous nettoyez le code existant et modifiez son comportement - écrivez des tests qui seront transmis lorsque la nouvelle fonctionnalité est correcte, et refactorisez jusqu'à ce qu'ils passent, en apportant des modifications incrémentielles à chaque test/refactoring.

Lorsque vos nouvelles spécifications passent, vous êtes sur la bonne voie. Si l'auteur précédent a mis en place des spécifications qui vérifient le comportement précédent, alors vous devrez déterminer quels tests, le cas échéant, sont actuellement valides (beaucoup d'entre eux peuvent l'être, car ils représentent les exigences l'application remplit actuellement), et en supprimant ceux qui ne le sont pas.

+0

définitivement la meilleure approche. Mon défi est que les modèles sont organisés de telle manière que, même s'ils ont des associations, créer et créer sur une poignée spécifique, centrale ne fonctionne tout simplement pas. vous devez appeler cette chose create_standard et new_standard qui construit tout et colle ensemble. De plus, en dépit de ses associations, il lie les modèles ensemble en définissant manuellement les identifiants de chacun des objets associés pour qu'ils aient la même valeur. Il a écrit un plugin pour lui permettre de mettre des identifiants. Il a fait tellement de mal ... – jaydel

+0

Et tout cela a été écrit à l'origine dans Rails, ou a-t-il été converti à partir d'une autre base de code (c'est moi qui essaie de faire quelque chose de fou)? Ça a l'air d'un cauchemar. J'espère que ce n'était pas une tentative explicite d'obscurcissement (ce qui ne profite vraiment à personne à long terme). – jefflunt

+0

Y a-t-il un espoir d'en arriver aux * raisons pour lesquelles * il a été implémenté de cette façon, afin de le restructurer de manière plus utile? Commencez-vous un peu à partir de rien ou s'agit-il d'une base de code dont vous connaissez les décisions de conception générales? – jefflunt

Questions connexes