有十几个Rails插件,其目标是在测试中替换灯具。以下是我能想到的一些内容:
可能有其他人。您更喜欢哪些插件?为什么?
答案 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)
分别建立或创建一个美国团队。