2010-04-28 11 views
9

Przy budowie następujące fabryki:Korzystanie Oprawy z factory_girl

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

ResumeType.first zwraca nil i dostaję błąd.

ResumeType zapisy są ładowane za pośrednictwem urządzeń. Sprawdziłem przy użyciu konsoli i wpisy są tam, tabela nie jest pusta.

Znalazłem podobny przykład na liście mailingowej factory_girl i powinno działać.

Czego mi brakuje? Czy muszę jakoś powiedzieć factory_girl, aby skonfigurować urządzenia przed uruchomieniem testów?

To właśnie moja test_helper wygląda następująco:

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

Dlaczego stosować mieszaninę fabryk i sprzętów? Fabryki zastępują urządzenia. –

+0

Jak wygląda twój test_helper.rb? –

+9

Używam urządzeń dla stałych danych, które nie zostaną zmienione przez nikogo po tym, jak zostanie zaimplementowany. – deb

Odpowiedz

6

Moja Rozwiązaniem tego problemu było stworzenie pliku db/seeds.rb który zawierał model kodu do wygenerowania moich danych nasion:

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

A następnie umieść go w moim 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" 

(Aby być sprawiedliwym, nie udało mi się uzyskać au tospec, aby grać z tym dobrze, ale wciąż duplikuje moje dane źródłowe, ale też nie próbowałem tego zbyt mocno.)

Ma to również tę zaletę, że Rails 3 jest gotowy i pracuje z prowizją db: seed task .

+9

Najlepiej jest utworzyć idempotentny plik db/seeds.rb, więc bez względu na to, jak często jest uruchamiany, nadal dostaje się do tego samego stanu końcowego. W twoim przykładzie zrobiłbym: 'Role.find_or_create_by_name (: name =>" Master ",: level => 99)'. –

0

Inną opcją jest dodanie seed.rb w test lub spec katalogu i wymagają go w pliku pomocnika przed swoimi fabryk:

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

Rails 2.3