Factory Girl Vs Fixture
27 October, 2013
在测试 Rails 时,我们需要准备测试数据,在这方面比较主流的工具有两种:
-
Fixture
Rails 默认方式
-
Thoughtbot公司开发的一套工具
一图胜千言,制作了两张流程图,以此表述 Fixture 与 Factory Girl 在准备测试数据的方式差异。
Fixture
Fixture 是如何准备测试数据的呢?
- 第①步霸王硬上弓,将数据塞到数据库 (Database)
- 第②步根据数据库中的数据创建对象(Object)
可真实世界中,Rails 的流程更多是这个样子:
- create an unsaved object
- save
- run calls in ActiveRecord, such as validates
- success or fail
两者大相径庭,Fixture 无法很好的测试 ActiveRecord 中的回调(callback)。
如果要实现回调函数,需要在Fixutre中插入一堆代码。这太没有美感了,有洁癖的程序员都不会干这种事情。
此外,在 Fixture 中维护两个对象之间的关系也是一件很费劲的事情。我们要在YAML文件中根据id创建关系,一不小心就会把自己绕进去。假如存在 User、Topic 两个类,他们之间的关系如此:
# topic belongs_to :user
# user has_many :topics
# 稍候补上代码
Factory Girl
Factory Girl 的准备方式与真实世界更相似。
- 第①步生成的对象可以是saved instances, unsaved instances;
- 可以在第②步执行ActiveRecord的各种回调
-
打理对象之间的关系十分方便
peter = create :user topic = create(:topic, user_id: peter) #测试时创建关系,更加flexible
总结
国内各种开源项目几乎都在用 Factory Girl,这么多人选择她,你也值得拥有。
她还有很多很实用的功能,比如继承、特征等等,请参考官方文档。