测试数据的构造,现在接触的分fixtures和factory_girl
A、先简单介绍下fixtures:
1、文件位于spec/fixtures/conversations.yml,均以yml结尾,在构造数据时特别要注意的
是在属性和值间必须用“空格”
例如:state: 0
2、在spec测试中调用构造数据的方法
用数据库表名+fixtures名
例如:workitems("complain_workitem")
如表间存在关联关系,则可以这样,用数据库表名+fixtures名+关联表名
例如:workitems("complain_workitem").conversation
3、加载数据命令: rake spec:db:fixtures:load
缺点:fixtures里构造的很多数据都是没有检测重复factory的功能、字段检验问题(字段过长不报错)
B、重点总结下factory_girl
当将构造数据从fixtures改为factory_girl时问题一大堆:1、factory重命名问题(堆栈溢出)、2、数据重复问题
1、如何解决上述说的第一个问题
主要出现的几率是不同实体factory的命名,在新建一个factory时要在factories里查找下
是否有重复命名,一般情况下, 添加一个factory在factories里面会加载进去,除非在
其他factory里已经显示的加载过
2、数据重复出现的可能性:有继承关系、用Factory()新建了多次、在factories里显示加载
多次(不同的factory)
(1)先检查factory本身的继承有没有问题,没有问题进行第二步
(2)检查与factory相关联的其他factory有没有新建
例如:在department里关联district
d.district { Factory :nanshan }前提是在factories里已经显示加载过
nanshan,此时这样做会重复出 现。
解决办法:在factories里写方法get_distrct来找记录或者新增记录
District.find_by_code(get_attribute(factory_name, :code)) ||
Factory(factory_name),在 department里关联district时,用
d.district { get_district :nanshan }即可。
3、 加载数据命令:rake db:factory_girl:load
最后建议在跑spec测试时,将要调用的factory最好在factories里面编写方法,这样可以避免很多问题(取的数据不一致问题)。实例的conversation定义方法:get_conversation