Rails中首选的夹具更换插件?

时间:2008-10-17 10:03:21

标签: ruby-on-rails ruby plugins fixtures

有十几个Rails插件,其目标是在测试中替换灯具。以下是我能想到的一些内容:

  • 灯具更换
  • 工厂女孩
  • 工厂和工人
  • rails情景
  • 夹具-方案
  • object daddy

可能有其他人。您更喜欢哪些插件?为什么?

9 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

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

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

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

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

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

答案 2 :(得分: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/

答案 3 :(得分:3)

+1工厂女孩

答案 4 :(得分:3)

我们刚开始将Factory Girl用于我们的项目。它的做事方式与我们的本土解决方案并没有太大的不同,所以它对我们来说效果很好。

答案 5 :(得分:3)

我和Ryan Bates一起使用Faker和Populator gem。他甚至在http://railscasts.com/episodes/126-populating-a-database进行了精彩的截屏视频。

答案 6 :(得分:3)

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

对于需要一组精选的相关对象的情况,灯具击败了工厂,您应该看看优秀的Lite Fixtures,这使得灯具更加干燥和易于管理。

答案 7 :(得分:2)

我最近一直在玩machinist并正在挖掘它。

答案 8 :(得分: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)分别建立或创建一个美国团队。