测试 Factory Girl Vs Fixture

xiaoronglv · 2013年11月02日 · 最后由 zzz6519003 回复于 2014年08月11日 · 3754 次阅读

spinner girl

在测试 Rails 时,我们需要准备测试数据,在这方面比较主流的工具有两种:

  1. Fixture

    Rails 默认方式

  2. Factory Girl

    Thoughtbot 公司开发的一套工具

一图胜千言,制作了两张流程图,以此表述 Fixture 与 Factory Girl 在准备测试数据的方式差异。

Fixture

fixture

Fixture 是如何准备测试数据的呢?

  1. 第①步霸王硬上弓,将数据塞到数据库(Database)
  2. 第②步根据数据库中的数据创建对象(Object)

可真实世界中,Rails 的流程更多是这个样子:

  1. create an unsaved object
  2. save
  3. run calls in ActiveRecord, such as validates
  4. success or fail

两者大相径庭,Fixture 无法很好的测试 ActiveRecord 中的回调(callback)。

如果要实现回调函数,需要在 Fixutre 中插入一堆代码。这太没有美感了,有洁癖的程序员都不会干这种事情。

此外,在 Fixture 中维护两个对象之间的关系也是一件很费劲的事情。我们要在 YAML 文件中根据 id 创建关系,一不小心就会把自己绕进去。假如存在 User、Topic 两个类,他们之间的关系如此:

# topic belongs_to :user # user has_many :topics # 稍候补上代码

Factory Girl

factory girl

Factory Girl 的准备方式与真实世界更相似。

  1. 第①步生成的对象可以是 saved instances, unsaved instances;
  2. 可以在第②步执行 ActiveRecord 的各种回调
  3. 打理对象之间的关系十分方便

    
    peter = create :user  
    topic = create(:topic, user_id: peter) #测试时创建关系,更加flexible
    

总结

她还有很多很实用的功能,比如继承、特征等等,请参考官方文档。

相关阅读

  1. Juanito: FactoryGirl 粗浅介绍
  2. Factory Girl wiki

原文: http://mednoter.com/factory-girl-vs-fixture.html

画了两张流程图,更形象一些。

哈哈我喜欢配图,话说楼主加个微信吧,我昨天面过 vincent 了~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号