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

目录
相关文章
|
11月前
|
测试技术 持续交付 UED
软件测试的艺术:确保质量的实战策略
在软件开发的舞台上,测试是那把确保每个功能如交响乐般和谐奏响的指挥棒。本文将深入探讨软件测试的重要性、基本类型以及如何设计高效的测试策略。我们将通过一个实际的代码示例,展示如何运用这些策略来提升软件质量和用户体验。
|
15天前
|
存储 关系型数据库 测试技术
玩转n8n测试自动化:核心节点详解与测试实战指南
n8n中节点是自动化测试的核心,涵盖触发器、数据操作、逻辑控制和工具节点。通过组合节点,测试工程师可构建高效、智能的测试流程,提升测试自动化能力。
|
2月前
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
2月前
|
存储 人工智能 算法
AI测试平台实战:深入解析自动化评分和多模型对比评测
在AI技术迅猛发展的今天,测试工程师面临着如何高效评估大模型性能的全新挑战。本文将深入探讨AI测试平台中自动化评分与多模型对比评测的关键技术与实践方法,为测试工程师提供可落地的解决方案。
|
2月前
|
人工智能 缓存 测试技术
Playwright进阶指南 (6) | 自动化测试实战
2025企业级测试解决方案全面解析:从单元测试到千级并发,构建高可用测试体系。结合Playwright智能工具,解决传统测试维护成本高、环境依赖强、执行效率低等痛点,提升测试成功率,内容从测试架构设计、电商系统实战框架、高级测试策略、Docker化部署、CI/CD集成及AI测试应用,助力测试工程师掌握前沿技术,打造高效稳定的测试流程。
Playwright进阶指南 (6) | 自动化测试实战
|
20天前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
264 11
|
2月前
|
资源调度 前端开发 JavaScript
Jest 测试实战指南
本文系统讲解如何使用 Jest 进行高效的 JavaScript 函数测试,涵盖环境搭建、测试用例编写、模拟函数与快照测试等内容,帮助开发者提升代码质量与测试效率。
|
6月前
|
监控 测试技术 数据库连接
RunnerGo API 性能测试实战:从问题到解决的全链路剖析
API性能测试是保障软件系统稳定性与用户体验的关键环节。本文详细探讨了使用RunnerGo全栈测试平台进行API性能测试的全流程,涵盖测试计划创建、场景设计、执行分析及优化改进。通过电商平台促销活动的实际案例,展示了如何设置测试目标、选择压测模式并分析结果。针对发现的性能瓶颈,提出了代码优化、数据库调优、服务器资源配置和缓存策略等解决方案。最终,系统性能显著提升,满足高并发需求。持续关注与优化API性能,对系统稳定运行至关重要。
|
2月前
|
人工智能 缓存 监控
大模型性能测试实战指南:从原理到落地的全链路解析
本文系统解析大模型性能测试的核心方法,涵盖流式响应原理、五大关键指标(首Token延迟、吐字率等)及测试策略,提供基于Locust的压测实战方案,并深入性能瓶颈分析与优化技巧。针对多模态新挑战,探讨混合输入测试与资源优化
|
4月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
747 23

热门文章

最新文章