使用factory_girl创建fixture数据

9

当构建以下工厂时:

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

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

你的test_helper.rb是什么样子的? - Joshua Partogi
10
我在使用测试数据生成器来存储一些固定的数据,这些数据在种子数据生成后不会被任何人更改。 - deb
3
我的情况下,为什么要使用工厂和固定装置的混合物呢?为了通过小步骤从一个转变到另一个。 - Graeme Mathieson
@GraemeMathieson同意!另一个用例是当您想要“单例”或“记忆化”夹具时,其ID在同一测试中的引用之间保持不变。另请参阅https://github.com/thoughtbot/factory_girl/issues/148 - Adam Spiers
回答“为什么要使用工厂和固定装置的混合物”的问题,对于我的情况来说?是为了将昂贵的模型构建委托给更快速的固定装置系统,以减少测试运行所需的时间。 - A Fader Darkly
显示剩余2条评论
2个回答

7

我的解决方案是创建一个 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)

然后将其包含在我的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"
< p >(公平地说,我还没有成功让autospec与此配合使用,因为它会重复我的种子数据,但我也没有尝试过。) < p >这也有一个好处,即可以在Rails 3中使用,并与rake db:seed任务一起工作。

10
最好的选择是创建一个幂等的 db/seeds.rb 文件,这样无论运行多少次,它仍然会达到相同的最终状态。在你的例子中,我会这样做:Role.find_or_create_by_name(:name => "Master", :level => 99) - Graeme Mathieson

0
另一个选项是在你的 `test` 或 `spec` 目录中添加 `seed.rb` 文件,并在你的辅助文件中引用它,以便在使用工厂之前加载它。
require File.expand_path(File.dirname(__FILE__) + "/seed")
require File.expand_path(File.dirname(__FILE__) + "/factories")

Rails 2.3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接