博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Rails测试《六》实战单元测试-用factory-girl替换fixtures来创建模拟数据2
阅读量:6243 次
发布时间:2019-06-22

本文共 2574 字,大约阅读时间需要 8 分钟。

上一篇我们介绍了factory-girl,这是一个很好的工具,可以用来替代rails中的fixtures,用来生成模拟数据。

它直观,易读,易读就易维护。最重要的一点是,它是面向model的,面向业务的,面向应用的,而fixtures模拟的数据是面向数据库的。但是我们的单元测试,功能测试,甚至将来要介绍的集成测试,都是面向业务的,从业务角度出发的测试,测试系统是否满足业务需求。所以好处显而易见了,相信大家在使用了以后会有一点感触。

上篇我们介绍了一些基本的使用,创建单个model的模拟对象,填充属性的值。

 
  1. FactoryGirl.define do 
  2.   factory :user_valid:class => :User do 
  3.     nickname "nickname" 
  4.     email "ee@123.com" 
  5.     password "123" 
  6.     password_confirmation "123" 
  7.   end 
  8.   factory :user_invalid_password_do_not_match:class => :User do 
  9.     nickname "nickname2" 
  10.     email "ee2@123.com" 
  11.     password "1232" 
  12.     password_confirmation "123" 
  13.   end 
  14. end 

上面模拟了两个user对象,一个有效的,一个无效的(因为密码不匹配)。

通过

 

 
  1. user = FactoryGirl.build(:user_valid

就可以访问到factory-girl模拟的数据,进而在单元测试及功能测试中使用这些模拟的数据。

 

但是有时候我们有更高的要求,比如说我们的实体是有关系的,has_many,belongs_to,has_and_belongs_to_many等等。是否能在创建model的同时,也创建它的关联实体?答案是:可以。

举一个简单的关系吧。就拿我的项目。

post和category,一个post属于一个category,一个category包含多个post。

 
  1. class Post < ActiveRecord::Base 
  2.   belongs_to :category 
  3. end 
  4. class Category < ActiveRecord::Base 
  5.   has_many :posts 
  6. end 

我们可以像下面这样做。

 
  1. FactoryGirl.define  do 
  2.   factory :category do 
  3.     title "category" 
  4.   end 
  5.  
  6.   factory :category_valid:class=>:Category do 
  7.     title "categorytitle" 
  8.   end 
  9. end 
  10.  
  11. FactoryGirl.define  do 
  12.  factory :post_valid_with_category1:class => :Post do 
  13.     title "post" 
  14.     slug "slug" 
  15.     summary "summary" 
  16.     content "content" 
  17.     category 
  18.   end 
  19.  
  20.   factory :post_valid_with_category2:class => :Post do 
  21.     title "post" 
  22.     slug "slug" 
  23.     summary "summary" 
  24.     content "content" 
  25.     association :category:factory => :category_valid 
  26.   end 
  27.  
  28. end 

上面显示我们用两种方式模拟了两个category,两个post,并且在post中指定了对应的category。

 

 
  1. build(:post_valid_with_category1).category.title="category" 
  2.  
  3. build(:post_valid_with_category1).category.title="categorytitle" 

我们可以像上面这样使用,就可以访问到post模拟对象的category模拟对象。

还有一种办法,利用alias别名。

假设我们的user和post和commenter是下面的关系。

 
  1. class User < ActiveRecord::Base 
  2.   attr_accessible :first_name:last_name 
  3.   has_many :posts 
  4. end 
  5.  
  6. class Post < ActiveRecord::Base 
  7.   attr_accessible :title 
  8.   belongs_to :author:class_name => "User":foreign_key => "author_id" 
  9. end 
  10.  
  11. class Comment < ActiveRecord::Base 
  12.   attr_accessible :content 
  13.   belongs_to :commenter:class_name => "User":foreign_key => "commenter_id" 
  14. end 

你就可以像下面这样创建模拟数据。

 
  1. factory :user, aliases: [:author:commenterdo 
  2.   first_name    "John" 
  3.   last_name     "Doe" 
  4. end 
  5.  
  6. factory :post do 
  7.   author 
  8.   # instead of 
  9.   # association :author, factory: :user 
  10.   title "How to read a book effectively" 
  11. end 
  12.  
  13. factory :comment do 
  14.   commenter 
  15.   # instead of 
  16.   # association :commenter, factory: :user 
  17.   content "Great article!" 
  18. end 

使用alias别名,给user对象起了两个别名,一个给post用,一个给comment用。别名分别对应于post和comment的两个属性。

 

 

 

本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/1076695,如需转载请自行联系原作者

你可能感兴趣的文章
Spring 单元测试
查看>>
品读Mybatis源码---(1)解析配置文件
查看>>
android获取设备分辨率的新方法
查看>>
函数式对象之自指向
查看>>
内建控制结构之变量范围
查看>>
我的友情链接
查看>>
解决Zabbix Grafana 2.5.0.1 不支持7day趋势数据显示
查看>>
JDBC为什么要使用PreparedStatement而不是Statement
查看>>
Cloud9 on Docker镜像发送
查看>>
图片交易平台Scoopshot获120万美元投资
查看>>
去掉JSON中值为null的
查看>>
我的友情链接
查看>>
职业考试的安排-2
查看>>
40个迹象表明你还是PHP菜鸟
查看>>
把程序员这条路走下去 .
查看>>
[Zephir官方文档翻译之四] 安装Zephir
查看>>
每天学一点Scala之内部类
查看>>
BWidget部件
查看>>
JavaScript强化教程 - 六步实现贪食蛇
查看>>
在oracle中恢复一个表的数据到某个时点
查看>>