15

有十几个 Rails 插件的目标是在测试中替换固定装置。以下是我能想到的几个:

  • 夹具更换
  • 工厂女工
  • 工厂和工人
  • 轨道场景
  • 夹具场景
  • 对象爸爸

可能还有其他人。您更喜欢这些插件中的哪一个,为什么?

4

9 回答 9

6

我个人将Faker与自定义工厂类一起使用。这允许我创建我的工厂,并使用非静态数据填充生成的实例。

# spec/factory.rb
module Factory
  def self.create_offer(options={})
    Offer.create({
      :code => Faker::Lorem.words(1),
      :expires_on => Time.now + (rand(30) + 1).day
    }.merge(options))
  end
end


# spec_helper.rb
require 'faker'
require 'spec/factory'


# In the specs
@offer = Factory.create_offer(:code => 'TESTING')
于 2008-10-17T10:23:44.587 回答
4

我会提倡Fixture Replacement 2。您的默认(无关)模型属性都存储在一个位置,db/example_data.rb,并提供快速有效的对象。您在创建时指定的任何属性都会覆盖默认属性 - 这意味着您关心的数据在 test中,仅此而已。

您的示例数据还可以引用其他默认模型,这些模型由具有延迟评估的 procs 表示,因此您可以在需要时轻松覆盖关联。

版本 2 提供了更清晰的定义格式,同时仍然new_*, create_*, and default_*为每个模型提供了神奇的方法。

我会避免任何一种鼓励构建越来越多以后难以阅读的测试数据的“场景”方案。您可以使用 FR2 创建命名(自定义)对象,但我从未发现需要它。

PS 确保你也考虑你的单元测试策略——Fixtures 和它们的所有类似物都是撞击数据库的真实对象,用于功能或集成测试。我目前正在使用 RSpec 的模拟stub_model()以及最新的unit_record gem 来禁止数据库访问。

于 2008-10-18T00:05:28.530 回答
4

我也可以给工厂女孩加一。当你有一个有点正常的模型集时,它可以在多个工厂之间关联的方式非常有用。例如,一个项目有一个项目经理。

Factory.define :project_manager do |f|
  f.first_name "John"
  f.last_name  "Doe"
end

Factory.define :project do |f|
  f.name "Sample Project"
  f.association :project_manager
end

这样您就不必担心在每个测试中实际设置关系。它还可以做一些像 Faker 这样的工作,您可以使用 Factory.sequence 在工厂中构建示例数据。有关 Factory Girl 的所有信息,请查看:http ://dev.thoughtbot.com/factory_girl/ 。

于 2009-10-06T06:37:39.447 回答
3

+1 工厂女孩

于 2008-10-17T13:10:50.507 回答
3

当您只需要一个或几个对象时,我是工厂的忠实粉丝。您可以自己编写或使用 Thoughtbot 的Factory Girl

对于需要一组相互关联的对象的情况,灯具比工厂好,您应该看看优秀的Lite Fixtures,它使灯具更加干燥和易于管理。

于 2009-01-11T06:35:15.203 回答
3

我们刚刚开始在我们的项目中使用 Factory Girl。它的做事方式与我们的本土解决方案没有太大不同,因此对我们来说效果很好。

于 2008-10-17T17:27:09.473 回答
3

我使用 Faker 和 Ryan Bates 的 Populator gem。他甚至在http://railscasts.com/episodes/126-populating-a-database上有一个不错的截屏视频。

于 2009-01-03T12:01:12.107 回答
2

我最近一直在和机械师玩耍,正在挖掘它。

于 2009-01-08T18:26:57.147 回答
0

工厂女孩很棒。我们在工作负载中使用它。

Factory.define :usa, :class => Team do |f|
  f.country_name 'USA'
  f.rank         15.6
end

Factory.define :player do |f|
  f.first_name 'Stevie'
  f.last_name  'Wonder'
  f.team       Factory.build(:usa)
end

然后在您的规范中,您可以分别使用Factory.build(:usa)Factory.create(:usa)建立或创建美国团队。

于 2009-06-29T23:04:57.017 回答