2010-04-28 12 views
9

Lors de la construction de l'usine suivante:Utilisation des appareils avec factory_girl

Factory.define :user do |f| 
    f.sequence(:name) { |n| "foo#{n}" } 
    f.resume_type_id { ResumeType.first.id } 
end 

ResumeType.first retourne nul et je reçois une erreur.

ResumeType Les enregistrements sont chargés via des appareils. J'ai vérifié en utilisant la console et les entrées sont là, la table n'est pas vide.

J'ai trouvé un exemple similaire dans la liste de diffusion de factory_girl, et il est supposé fonctionner.

Qu'est-ce qui me manque? Dois-je en quelque sorte dire à factory_girl de configurer les appareils avant d'effectuer les tests?

C'est ce que mon test_helper ressemble:

ENV["RAILS_ENV"] = "test" 
require File.expand_path(File.dirname(__FILE__) + "/../config/environment") 
require 'test_help' 

class ActiveSupport::TestCase 
    self.use_transactional_fixtures = true 
    self.use_instantiated_fixtures = false 
    fixtures :all 
end 
+0

Pourquoi utiliser un mélange d'usines et des accessoires? Les usines remplacent les appareils. –

+0

Comment ressemble votre test_helper.rb? –

+9

J'utilise des fixtures pour des données fixes qui ne seront pas modifiées par quiconque après leur seeded. – deb

Répondre

6

Ma solution à c'était de créer un fichier db/seeds.rb qui contenait un code modèle pour générer mes données de semences:

# Create the user roles 
Role.create(:name => "Master", :level => 99) 
Role.create(:name => "Admin", :level => 80) 
Role.create(:name => "Editor", :level => 40) 
Role.create(:name => "Blogger", :level => 30) 
Role.create(:name => "User", :level => 0) 

et alors inclure dans mon spec_helper.rb:

ENV["RAILS_ENV"] = 'test' 
require File.expand_path(File.join(File.dirname(__FILE__),'..','config','environment')) 
require 'spec/autorun' 
require 'spec/rails' 
require "#{Rails.root}/db/seeds.rb" 

(pour être honnête, je ne l'ai pas réussi à obtenir au tospec pour jouer sympa avec ça tout en continuant à dupliquer mes données de départ, mais je n'ai pas essayé aussi dur.)

Cela a aussi l'avantage d'être Rails 3 prêt et de travailler avec la tâche rake db: seed .

+9

Votre meilleur pari est de créer un fichier db/seeds.rb idempotent, donc peu importe combien de fois il est exécuté, il obtient toujours le même état final. Dans votre exemple, je ferais: 'Role.find_or_create_by_name (: nom =>" Master ",: level => 99)'. –

0

Une autre option consiste à ajouter seed.rb dans votre répertoire test ou spec et nécessitent dans votre fichier d'aide avant que vos usines:

require File.expand_path(File.dirname(__FILE__) + "/seed") 
require File.expand_path(File.dirname(__FILE__) + "/factories") 

Rails 2.3

Questions connexes