2010-04-28 11 views
9

Quando si costruisce la seguente fabbrica:Utilizzo di apparecchi con factory_girl

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

ResumeType.first restituisce nil e ottengo un errore.

ResumeType I record vengono caricati tramite fixture. Ho controllato usando la console e le voci ci sono, la tabella non è vuota.

Ho trovato un esempio simile nella mailing list factory_girl e dovrebbe funzionare.

Cosa mi manca? Devo in qualche modo dire a factory_girl di configurare i dispositivi prima di eseguire i test?

Questo è quello che sembra il mio test_helper come:

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

Perché utilizzare una miscela di fabbriche e infissi? Le fabbriche sostituiscono i dispositivi. –

+0

Come è il tuo test_helper.rb? –

+9

Uso le fixture per dati fissi che non verranno modificati da nessuno dopo la sua inizializzazione. – deb

risposta

6

La mia soluzione a questo è stato quello di creare un file db/seeds.rb che conteneva il codice del modello per generare miei dati seme:

# 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) 

e poi includerlo nel mio 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" 

(per essere onesti, non ho riuscito ad ottenere au tospec per giocare bene con questo ancora come continua a duplicare i miei dati seme, ma non ho ancora provato tutto questo.)

Questo ha anche il vantaggio di essere Rails 3 pronto e funzionante con il rake db: seed task .

+9

La soluzione migliore è quella di creare un file db/seeds.rb idempotente, quindi non importa quanto spesso viene eseguito, si ottiene comunque verso lo stesso stato finale. Nel tuo esempio, farei: 'Role.find_or_create_by_name (: name =>" Master ",: level => 99)'. –

0

Un'altra opzione è quella di aggiungere seed.rb nella directory test o spec e richiedono nel file helper davanti agli stabilimenti:

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

Rails 2.3

Problemi correlati