2010-04-28 10 views
9

Khi xây dựng các nhà máy sau:Sử dụng đồ đạc với factory_girl

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

ResumeType.first lợi nhuận nil và tôi nhận được một lỗi.

ResumeType bản ghi được tải qua đồ đạc. Tôi đã kiểm tra bằng cách sử dụng giao diện điều khiển và các mục có ở đó, bảng không rỗng.

Tôi đã tìm thấy một ví dụ tương tự trong danh sách gửi thư factory_girl và nó được cho là hoạt động.

Tôi đang thiếu gì? Tôi có phải bằng cách nào đó nói với factory_girl để thiết lập các đồ đạc trước khi chạy thử nghiệm?

Đây là những gì test_helper của tôi trông giống như:

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

Tại sao sử dụng một hỗn hợp của các nhà máy và đồ đạc? Nhà máy thay thế đồ đạc. –

+0

Test_helper.rb của bạn trông như thế nào? –

+9

Tôi đang sử dụng đồ đạc cho dữ liệu cố định sẽ không bị thay đổi bởi bất kỳ ai sau khi được gieo hạt. – deb

Trả lời

6

Giải pháp của tôi cho điều này là tạo ra một db/file seeds.rb trong đó có mã số mô hình để tạo ra dữ liệu hạt giống của tôi:

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

Và sau đó bao gồm nó trong spec_helper.rb của tôi:

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" 

(Để công bằng, tôi đã không quản lý để có được au tospec để chơi tốt đẹp với điều này được nêu ra vì nó giữ sao chép dữ liệu hạt giống của tôi, nhưng tôi đã không cố gắng tất cả những khó khăn hoặc.)

Điều này cũng có lợi ích là Rails 3 sẵn sàng và làm việc với công việc rake db: seed .

+9

Đặt cược tốt nhất của bạn là tạo một tệp db/seeds.rb idempotent, do đó, bất kể tần suất nó chạy như thế nào, nó vẫn đang hướng tới cùng một trạng thái kết thúc. Trong ví dụ của bạn, tôi sẽ làm: 'Role.find_or_create_by_name (: name =>" Master ",: level => 99)'. –

0

Một lựa chọn khác là thêm seed.rb tại của bạn thư mục test hoặc spec và yêu cầu nó trong tập tin helper của bạn trước khi nhà máy của bạn:

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

Rails 2.3