2010-04-28 9 views
9

Wenn die folgende Fabrikgebäude:mit Geräten mit factory_girl

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

ResumeType.first kehrt nil und ich erhalte eine Fehlermeldung.

ResumeType Datensätze werden über Fixtures geladen. Ich überprüfte mit der Konsole und die Einträge sind da, die Tabelle ist nicht leer.

Ich habe ein ähnliches Beispiel in der Mailingliste factory_girl gefunden, und es soll funktionieren.

Was fehlt mir? Muss ich irgendwie factory_girl sagen, um die Fixtures einzurichten, bevor die Tests ausgeführt werden? Diese

ist, was meine test_helper wie folgt aussieht:

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

Warum eine Mischung aus Fabriken und Vorrichtungen verwenden? Fabriken ersetzen Leuchten. –

+0

Wie sieht dein test_helper.rb aus? –

+9

Ich benutze Fixtures für feste Daten, die von niemandem geändert werden, nachdem es gesetzt wurde. – deb

Antwort

6

Meine Lösung dieses Problems war eine db/seeds.rb-Datei zu erstellen, die Modellcode enthalten sind, zu meinen Samen Daten zu erzeugen:

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

Und dann in meinem 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" 

(Um fair zu sein, habe ich nicht geschafft, au zu bekommen tospec, um mit dieser noch nett zu spielen, weil es meine Saatdaten verdoppelt, aber ich habe auch nicht alles so hart versucht.)

Dies hat auch den Vorteil, Rails 3 bereit zu sein und mit dem Rake db: seed task zu arbeiten .

+9

Am besten erstellen Sie eine idempotente db/same.rb-Datei, also egal, wie oft sie ausgeführt wird, sie erreicht immer noch denselben Endzustand. In meinem Beispiel würde ich tun: 'Role.find_or_create_by_name (: name =>" Master ",: level => 99)'. –

0

Eine weitere Option ist seed.rb in Ihrem test oder spec Verzeichnis hinzuzufügen und erfordert es in Ihrer Helfer-Datei, bevor Sie Ihre Fabriken:

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

Rails 2.3