2011-08-28 4 views
4

Quelqu'un pourrait expliquer pourquoi les usines sont plus utiles qu'une simple instanciation au cours du test? Plus clairement, je ne vois pas la différence entre:Rails 3 Factories vs Simple Instantiation

before(:each) do 
    @attr = { 
    :name => "Example User", 
    :email => "[email protected]", 
    :password => "foobar", 
    :password_confirmation => "foobar" 
    } 
end 

it "should create a new instance given valid attributes" do 
    User.create!(@attr) 
end 

et ce

before(:each) do 
    @user = Factory(:user) 
end 

qui a l'usine suivante:

Factory.define :user do |user| 
    user.name     "Michael Hartl" 
    user.email     "[email protected]" 
    user.password    "foobar" 
    user.password_confirmation "foobar" 
end 

Répondre

4

Parce qu'il vous permet d'avoir en un seul endroit tous les vos variables requises plus les associations.

De plus, vous pouvez facilement créer des stubs ou simplement extraire des attributs sans code supplémentaire.

L'intérêt est plus clair une fois que vous avez plusieurs fichiers de test que vous voulez garder votre code DRY.

Sidenote:

Vous devez utiliser « laisser » au lieu de créer à chaque fois qu'une variable d'instance

+0

Merci apneadiving. Cela m'a semblé la même chose, alors j'ai supposé la commodité, mais puisque j'apprends cela de toutes pièces, je voulais m'assurer que je ne manquais de rien. Merci! –

5

Plus votre application obtient, plus les avantages vous gagnez des usines.

Votre solution est idéale pour 2-3 modèles. Mais disons que vous avez un modèle d'article dans lequel vous avez besoin d'utilisateurs valides pour tester des choses. Maintenant vous avez 2 fichiers où vous définissez @attr pour les utilisateurs. Maintenant, imaginez qu'il y a encore plus de modèles qui ont besoin d'utilisateurs, comme des commentaires, des rôles, etc.

Il est plus pratique d'utiliser des usines. Les avantages sont que vous pouvez définir plusieurs prototypes par défaut. Comme un utilisateur administrateur, un utilisateur normal, un utilisateur non enregistré, etc.

En outre, le code est SEC, donc si vous ajoutez un nouveau champ obligatoire, vous pouvez l'ajouter une fois à votre usine et vous avez terminé. Donc, la réponse est la suivante: Fondamentalement, ils sont les mêmes, mais plus votre application est grande, plus vous avez besoin d'un moyen de gérer tous vos prototypes.

+0

+1 pour les détails fournis – apneadiving

+0

Merci! C'est très clair. –