有十几个 Rails 插件的目标是在测试中替换固定装置。以下是我能想到的几个:
- 夹具更换
- 工厂女工
- 工厂和工人
- 轨道场景
- 夹具场景
- 对象爸爸
可能还有其他人。您更喜欢这些插件中的哪一个,为什么?
有十几个 Rails 插件的目标是在测试中替换固定装置。以下是我能想到的几个:
可能还有其他人。您更喜欢这些插件中的哪一个,为什么?
我个人将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')
我会提倡Fixture Replacement 2。您的默认(无关)模型属性都存储在一个位置,db/example_data.rb,并提供快速有效的对象。您在创建时指定的任何属性都会覆盖默认属性 - 这意味着您关心的数据在 test中,仅此而已。
您的示例数据还可以引用其他默认模型,这些模型由具有延迟评估的 procs 表示,因此您可以在需要时轻松覆盖关联。
版本 2 提供了更清晰的定义格式,同时仍然new_*, create_*, and default_*
为每个模型提供了神奇的方法。
我会避免任何一种鼓励构建越来越多以后难以阅读的测试数据的“场景”方案。您可以使用 FR2 创建命名(自定义)对象,但我从未发现需要它。
PS 确保你也考虑你的单元测试策略——Fixtures 和它们的所有类似物都是撞击数据库的真实对象,用于功能或集成测试。我目前正在使用 RSpec 的模拟stub_model()
以及最新的unit_record gem 来禁止数据库访问。
我也可以给工厂女孩加一。当你有一个有点正常的模型集时,它可以在多个工厂之间关联的方式非常有用。例如,一个项目有一个项目经理。
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/ 。
+1 工厂女孩
当您只需要一个或几个对象时,我是工厂的忠实粉丝。您可以自己编写或使用 Thoughtbot 的Factory Girl。
对于需要一组相互关联的对象的情况,灯具比工厂好,您应该看看优秀的Lite Fixtures,它使灯具更加干燥和易于管理。
我们刚刚开始在我们的项目中使用 Factory Girl。它的做事方式与我们的本土解决方案没有太大不同,因此对我们来说效果很好。
我使用 Faker 和 Ryan Bates 的 Populator gem。他甚至在http://railscasts.com/episodes/126-populating-a-database上有一个不错的截屏视频。
我最近一直在和机械师玩耍,正在挖掘它。
工厂女孩很棒。我们在工作负载中使用它。
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)
建立或创建美国团队。