Rails测试《六》实战单元测试-用factory-girl替换fixtures来创建模拟数据2

简介:

上一篇我们介绍了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的同时,也创建它的关联实体?答案是:可以。

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

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,如需转载请自行联系原作者

目录
相关文章
|
21天前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
28 6
|
23天前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
26 1
|
1月前
|
测试技术 开发者 UED
探索软件测试的深度:从单元测试到自动化测试
【10月更文挑战第30天】在软件开发的世界中,测试是确保产品质量和用户满意度的关键步骤。本文将深入探讨软件测试的不同层次,从基本的单元测试到复杂的自动化测试,揭示它们如何共同构建一个坚实的质量保证体系。我们将通过实际代码示例,展示如何在开发过程中实施有效的测试策略,以确保软件的稳定性和可靠性。无论你是新手还是经验丰富的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
2月前
|
存储 测试技术 数据库
数据驱动测试和关键词驱动测试的区别
数据驱动测试 数据驱动测试或 DDT 也被称为参数化测试。
35 1
|
2月前
|
机器学习/深度学习 监控 计算机视觉
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
510 0
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 并行计算 数据可视化
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用PaddleClas框架完成多标签分类任务,包括数据准备、环境搭建、模型训练、预测、评估等完整流程。
134 0
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
62 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 XML 并行计算
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用YOLOX完成图像目标检测任务的完整流程,包括数据准备、模型训练、验证和测试。
223 0
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
51 4
|
2月前
|
SQL 消息中间件 大数据
大数据-159 Apache Kylin 构建Cube 准备和测试数据(一)
大数据-159 Apache Kylin 构建Cube 准备和测试数据(一)
72 1