使用工具与factory_girl

deb*_*deb 9 unit-testing factory ruby-on-rails fixtures factory-bot

在建造以下工厂时:

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

ResumeType.first返回nil,我收到一个错误.

ResumeType记录通过夹具加载.我使用控制台检查并且条目在那里,表不是空的.

我在factory_girl邮件列表中找到了一个类似的例子,它应该有效.

我错过了什么?在运行测试之前,我是否必须以某种方式告诉factory_girl设置灯具?

这就是我的test_helper的样子:

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
Run Code Online (Sandbox Code Playgroud)

小智 6

我的解决方案是创建一个db/seeds.rb文件,其中包含用于生成种子数据的模型代码:

# 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)
Run Code Online (Sandbox Code Playgroud)

然后将其包含在我的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"
Run Code Online (Sandbox Code Playgroud)

(公平地说,我还没有设法让autospec玩得很好,因为它不断重复我的种子数据,但我也没有尝试过那么多.)

这也有利于Rails 3准备好并使用rake db:seed任务.

  • 你最好的办法是创建一个幂等的db/seeds.rb文件,所以无论它运行的频率如何,它仍然会达到相同的最终状态.在你的例子中,我会这样做:`Role.find_or_create_by_name(:name =>"Master",:level => 99)`. (9认同)