Rspec: everyday-rspec实操: 第10章测试其他功能,第11章TDD 第12章总结。
10.测试文件上传
作者推荐的Paperclip,官方维护组已经不推荐使用deprecated。
推荐使用rails自带的 ActiveStorage.
推进文件上传到云存储,并附加这些文件到Active Record object。它 和本地驱动服务一起用于开发和测试。也支持反射文件到附属服务作为备份backups and migrations。
http://guides.rubyonrails.org/active_storage_overview.html
首先,编写针对文件上传功能的测试(用的是Capybara的方法),并提供要使用的文件。attach_file "Attachment", "#{Rails.root}/spec/files/attachment.jpg"
接着,指定测试专用的上传路径。
最后,让 RSpec 在测试结束后清理文件。spec/rails_helper.rb
RSpec.configure do |config|
# 省略这个块里的其他内容 ...
# 测试组件运行完毕后清理上传的文件
config.after(:suite) do
FileUtils.rm_rf(Dir["#{Rails.root}/spec/test_uploads/"])
end
end
这是在功
能层测试文件上传的三个基本步骤。如果你用的不是 Paperclip,参阅上传库的文档,找出实现这三步的
方法。
10.3 测试电子邮件发送
大概浏览。会用到ActiveJob::TestHelper的方法
10.4 web 服务的测试,(⚠️没看)
第 11 章 迈向测试驱动开发
首先编写测试,然后编写能
让测试通过的代码,最后重构,从长远利益重新审视代码的实现方式。
在这个过程中,测试影响代码选择,力求写出没有缺陷的软件,而且新需求出现时,也不担心更新会破坏现有功能。
pending: (adj) waiting to be decided or settled.
11.1 feature test
• 添加一个按钮,用于把项目标记为已完成;
• 用户登录后控制台中不显示已完成的项目。
第一,在动手之前,先运行整个测试组件,确保添加功能之前所有测试都能通过
然后,新建feature test, 并列出要做的事情,用注释标记在scenario中。
之后,编写测试代码,把注释替换为真正的步骤。
11.2 from red to green
再次运行测试rspec spec/features/xxx_spec.rb --tag foucs
发现❌
Failure/Error: click_button "Complete"Capybara::ElementNotFound: Unable to find visible button "Complete"
编写缺少的程序代码 视图中的按钮
然后在运行测试发现❌
Projects user completes a projectFailure/Error: expect(project.reload.completed?).to be true NoMethodError: undefined method `completed?' for #<Project:0x00007f97b4392698>
根据RSpec的提示,根据业务逻辑编写代码,不同的业务逻辑意味不同的实现方法。
这里是通过用户的操作,点击按钮来判断project.completed?
因此需要定义completed?方法。这个方法根据项目中任务集合是否为空进行判断。
应该把是否完成设置为Project属性,用于储存是否完成的状态。
所以应该为Project添加属性completed: boolean。
$ bin/rails g migration add_completed_to_projects completed:boolean
$ bin/rails db:migrate 这里面临设计抉择? 使用哪个路由处理点击按钮后更新database的操作。可以使用Project的 update动作。也可以添加一个新的动作。还是添加新动作吧。 需要更改view,controller, route。 view: 按钮添加路径complete_project_path(@project) 然后测试,看提示说没有路径,继续添加路径: route: 在 resources :projects 块内增加patch "complete", on: :member 然后测试,看提示说没有action: complete,于是在控制器添加动作complete: def complete..end ⚠️,测试驱动开发的原则之一是,为了让测试驱动推荐,每次尽量少添加新代码。 再测试,发现提示 Projects user completes a project Failure/Error: unless @project.owner == current_user NoMethodError: undefined method `owner' for nil:NilClass 这是因为有钩子方法,回调。于是在before_action :set_project中增加 :complete 再测试,发现提示: Failure/Error: expect(project.reload.completed?).to be true expected true got false 已经到了测试控制器动作了,但我们之前没写细节,所以❌。完善动作。 再测试,发现提示: Failure/Error: expect(page).to have_content "Completed" 没有找到Completed字符串,这是因为我们没有在页面添加上 在视图山添加个标签<span>。 再测试,发现提示:Failure/Error: expect(page).to_not have_button "Complete"expected not to find button "Complete", found 1 match: "Complete" 项目完成,原来的Complete按钮应当改变.在view中改名其结构,增加if语句。 再测试,通过!Finished in 2.4 seconds
1 example, 0 failures 去掉:focus标签,运行整个测试bin/rails rspec看局部改动是否破坏整体功能。 11.3 from outside to inside 由外而内大多数时候,RSpec提高的反馈是明确的,但有时候,需要深入研究才能找到线索。这时可以使用gem 'launchy'调试,save_and_open_page. 但通常要编写更多的测试才能理解问题所在。 这些额外的测试在不同的层级监管代码,对初始的测试进行补充。 这就是由外而内的测试。 如果模拟浏览器测试显得大材小用,也可以使用低层级的测试。如控制器测试。 集成测试用的是模拟浏览器的功能测试,如果是测试API,使用request test。 然后通过低级 测试尽量直接测试细节,如模型层测试,或者用单独的Ruby代码测试。 11.4 red-green-refactor 循环
先练习编写简单的测试 多想,多做笔记可以先写一些生产环境的代码,先试探一下。比如建立个git临时分支尝试。 尽量先编写集成测试TDD 合理规划测试时间,刚开始学习写测试肯定花费时间。 保持简单,基础扎实,再用更多的复杂概念 mock stub 遇到卡住失败测试,可以先标记一下,稍后再回来解决。 RSpec官方文档:地址: 总文档连接: RSpec.info/documentation/ https://relishapp.com/rspec/
Rspec: everyday-rspec实操: 第10章测试其他功能,第11章TDD 第12章总结。的更多相关文章
- 【实操笔记】MySQL主从同步功能实现
写在前边: 这两天来了个需求,配置部署两台服务器的MySQL数据同步,折腾了两天查了很多相关资料,一直连不上,后来发现其实是数据库授权的ip有问题,我们用的服务器是机房中的虚拟机加上反向代理出来的,坑 ...
- RENIX非对称时延测试——网络测试仪实操
本文主要介绍RENIX软件如何进行非对称时延测试.文章分为四部分,第一部分为非对称时延概述,第二部分为测试说明,第三部分为测试配置,第四部分为测试报告. 第一部分:非对称时延概述 1.RFC2544测 ...
- Rspec: everyday-rspec实操。FactoryBot预构件 (rspec-expectations gem 查看匹配器) 1-4章
总文档连接: RSpec.info/documentation/ 包括core, expectiation,rails , mock, 点击最新版本,然后右上角搜索class, method. 第3章 ...
- 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!
本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 在本文中,作者引出了"外部数据"这一概 ...
- Istio的流量管理(实操一)(istio 系列三)
Istio的流量管理(实操一)(istio 系列三) 使用官方的Bookinfo应用进行测试.涵盖官方文档Traffic Management章节中的请求路由,故障注入,流量迁移,TCP流量迁移,请求 ...
- Istio的流量管理(实操三)
Istio的流量管理(实操三) 涵盖官方文档Traffic Management章节中的egress部分.其中有一小部分问题(已在下文标注)待官方解决. 目录 Istio的流量管理(实操三) 访问外部 ...
- R数据分析:孟德尔随机化实操
好多同学询问孟德尔随机化的问题,我再来尝试着梳理一遍,希望对大家有所帮助,首先看下图1分钟,盯着看将下图印在脑海中: 上图是工具变量(不知道工具变量请翻之前的文章)的模式图,明确一个点:我们做孟德尔的 ...
- Mysql MHA(GTID)配置(实操)
实现环境 centos6.7 MYSQL5.6.36 主:192.168.1.191 从1:192.168.1.145 从2:192.168.1.146 监测:放在从2上 192.168.1.146 ...
- .net基础学java系列(四)Console实操
上一篇文章 .net基础学java系列(三)徘徊反思 本章节没啥营养,请绕路! 看视频,不实操,对于上了年龄的人来说,是记不住的!我已经看了几遍IDEA的教学视频: https://edu.51cto ...
随机推荐
- docker :no such file or directory
---恢复内容开始--- 其中最主要的问题是:details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: ...
- Oracle 的闪回技术 --flashback
SQL Fundamentals: 表的创建和管理 如何开启数据库闪回? SQL> shutdown immediate; ORA-01109: database not open Databa ...
- ES6基础教程(整理自阮一峰)
------------------------ECMAScript 6 简介------------------------ECMAScript 和 JavaScript 的关系是,前者是后者的规格 ...
- vue - webpack、babel
一.webpack 在这里我仅仅的是对webpack做个讲解,webpack这个工具非常强大,解决了我们前端很繁琐的一些工具流程繁琐的事情.如果感兴趣的同学,建议还是看官网吧. 中文链接地址:http ...
- python调用API
相信做过自动化运维的同学都用过API接口来完成某些动作.API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化运维的必修课. 本文主要介绍Python中调用API的几种方式,下面是 ...
- 使用JavaScript修改浏览器URL地址栏的实现代码
现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...
- 一、Mosquitto 介绍&安装
一.Mosquitto 介绍 一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的 ...
- log4j2高级配置(1)
一.Log4j2高级配置介绍(1) (1)日志输出到文件配置 <!-- 将日志输出到指定位置的文件中 --> <RollingFile name="RollingFi ...
- html5语法改变
<!doctype html> 简化了 <meta http-equiv="Content-type" content="text/html;chars ...
- SqlServer2005 各版本区别
SQL2005 分五个版本,如下所列, 1.Enterprise(企业版), 2.Development(开发版), 3.Workgroup,(工作群版) 4.Standard,(标准版) 5.Exp ...