Don't Repeat Yourself.

• 把操作步骤提取到辅助模块中;✅
• 通过let复用测试中的实例变量;✅
• 把通用的设置移到共享的情景中;⚠️(不喜欢)
• 在RSpec和rspec-rails提供的匹配器之外,自定义匹配器;⚠️未学习

• 把多个测试用例中的期望合到一个测试用例中;✅aggregate_failure do ..end
• 判断何时可以抽象,何时应该写在测试中。 ❌,老手才会这么做。


8.1 support module

拉下来的分支不知道什么原因又错误。自己在第6章features test又开了一个分支06-text

另外不知道什么原因不能登陆devise. 在从开的06-text可以正常使用。

本节讲的是把登陆代码提取出来建立一个模块,用的时候引用就行了。把模块建立在support文件夹下面。如support/login_support.rb,然后RSpec引入模块,或者手动include需要的地方。

或者使用Devise自带的方法 ,引用模块Warden::Test::Helpers,不过这个不包含进入首页,所以还要visit root_path

    login_as user, scope: :user

visit root_path


8.2 let 实现惰性加载。

在同一个块内,describe, context,  before的作用是在example之前加载好数据。

let()方法是在it内调用它声明的变量时,才会加载预构件或固件。

所以:before中的变量用的是实例变量@variable, 而let定义的是变量只在当前块内新建,使用,然后销毁。

React中的let相当于变量可以修改,对应的是const 不可修改。

举例:模型测试task,  建立测试模型和预构件。

rails generate rspec:model task

create spec/models/task_spec.rb

invoke factory_girl

create spec/factories/tasks.rb

RSpec.describe Note, type: :model do
  let(:user){FactoryGirl.create(:user)} #这里声明了预构件变量
  let(:project){FactoryGirl.create(:project, owner: user)}
  it "is valid with a user, project, and message" do
    note = Note.new(
      message: "This is a sample note.",
      user: user,          #这里加载了let(:user)
      project: project,   #这里加载了let(:project)
    )
    expect(note).to be_valid
  end  #block结束后删除变量user, project

...

小结:let还有变形 let! :加载预构件,不是惰性加载了,避免使用let!

可以考虑before块和实例变量,设置直接在需要测试的example中定义测试数据也行。

根据团队需要灵活使用。


8.3 shared context

共享情景,在不同文件中共享let定义的预构件。

我不觉得太好。因为有点过度重构了,不利于他人的维护。本身使用预构件就已经简化了。

let 能让测试数据在多个测试用例中共用,而共享的情景能让相同的设置在多个测试文件中共用。

support/contexts/XXX_setup.rb

RSpec.shared_context "XXX setup" do

#let()... 写let

end

在其他测试中include_context "XXX setup"


8.4 self-define matcher (未看)自定义匹配器


8.5 聚合失败 aggregate failure

Rspec3.3新功能。

约定俗称,在model test and controller test中每个example只放一个expect(), 因此用不到aggregate failure功能。

而在, feature test and request test中每个example可以放多个expect(), 如果前一个expect出错,则停止运行后面的expect测试。

因此需要用到aggregate failure功能让后面的expect()继续测试。

如: spec/controllers/projects_controller_spec.rb

      it "responds successfully" do
        # sign_in @user #注释掉
        get :index
        aggregate_failures do
          expect(response).to be_success
          expect(response).to have_http_status "200"
        end
      end

两个expect都会运行。并在命令行窗口输出错误❌。

我们真正聚合的是可能失败的期望,而不是一般性失败。尽管如此,我还是喜欢聚合失败这
个功能,而且经常在测试中使用。
aggregate_failure do..end


8.6 维护测试的可读性

如果测试十分臃肿,可以使用:

单层抽象测试法:

把每一步提取出来,定义为单独的辅助方法,这样在阅读测试时,我们就不用来回变换上下
文。如果以后要添加新期望,也定义为辅助方法,而不直接写在测试用例中。

作者只建议老手这么做(熟练掌握RSpec和Capybara)。因为辅助方法多了可读性也会下降。

Rspec: everyday-rspec实操: 第8章DRY. (6个方法,其中3个方法好上手)的更多相关文章

  1. Rspec: everyday-rspec实操: 第10章测试其他功能,第11章TDD 第12章总结。

    10.测试文件上传 作者推荐的Paperclip,官方维护组已经不推荐使用deprecated. 推荐使用rails自带的 ActiveStorage. Active Storage: 推进文件上传到 ...

  2. symfony 踩坑之旅 视频实操从第九章开始

    1.annotation定义路由 @Route("/**",defaults={"name":"world"},requirements={ ...

  3. TensorFlow入门实操课程第一章练习笔记

    在本练习中,您将尝试构建一个神经网络,让它根据一个简单的公式来预测房屋的价格. 想象一下,如果房子的定价很简单,带一间卧室的房子价格是5万+5万,那么一间卧室的房子要花10万元:两间卧室的房子就要花1 ...

  4. TensorFlow入门实操课程第一章教程笔记

    神经元网络深度学习的起步程序 Hello World 第一个应用程序总是应该从超级简单的东西开始,这样可以看到代码如何产生和运作的整体框架. 就创建神经网络而言,我喜欢使用的例子是一个能够学习两组数字 ...

  5. Rspec: everyday-rspec实操。5:controller test(了解基础)

    第 5 章 控制器测试 5.1基础 rails generate rspec:controller home RSpec.describe HomeController, type: :control ...

  6. .net基础学java系列(四)Console实操

    上一篇文章 .net基础学java系列(三)徘徊反思 本章节没啥营养,请绕路! 看视频,不实操,对于上了年龄的人来说,是记不住的!我已经看了几遍IDEA的教学视频: https://edu.51cto ...

  7. 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!

    本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 在本文中,作者引出了"外部数据"这一概 ...

  8. Istio的流量管理(实操一)(istio 系列三)

    Istio的流量管理(实操一)(istio 系列三) 使用官方的Bookinfo应用进行测试.涵盖官方文档Traffic Management章节中的请求路由,故障注入,流量迁移,TCP流量迁移,请求 ...

  9. Istio的流量管理(实操三)

    Istio的流量管理(实操三) 涵盖官方文档Traffic Management章节中的egress部分.其中有一小部分问题(已在下文标注)待官方解决. 目录 Istio的流量管理(实操三) 访问外部 ...

随机推荐

  1. 【kafka学习之四】kafka集群性能测试

    kafka集群的性能受限于JVM参数.服务器的硬件配置以及kafka的配置,因此需要对所要部署kafka的机器进行性能测试,根据测试结果,找出符合业务需求的最佳配置. 1.kafka broker j ...

  2. Python实现在给定整数序列中找到和为100的所有数字组合

    摘要:  使用Python在给定整数序列中找到和为100的所有数字组合.可以学习贪婪算法及递归技巧. 难度:  初级 问题 给定一个整数序列,要求将这些整数的和尽可能拼成 100. 比如 [17, 1 ...

  3. Vert.x

    Vert.x是一个基于JVM.轻量级.高性能的应用平台,非常适用于最新的移动端后台.互联网.企业应用架构.Vert.x基于全异步Java服务器Netty,并扩展出了很多有用的特性. 同时支持多种编程语 ...

  4. SNMP学习笔记之Linux下安装和配置SNMP

    注意:本篇安装用户是root,非root用户启动的时候会报缺少文件错误. 一.安装SNMP 1.1.下载Net-SNMP的源代码 选择一个SNMP版本,比如5.7.1,下载地址如下:http://so ...

  5. 主攻ASP.NET MVC4.0之重生:Asp.Net MVC WebApi OData

    1.新建MVC项目,安装OData Install-Package Microsoft.AspNet.WebApi.OData -Version 4.0.0 2.新建WebAPI Controller ...

  6. c++的友元类、方法及其益处

    在java中,我们知道除了public和private,protected外,还有默认的包可见性访问级别,虽然如此,很多时候出于早期设计缺陷的原因,我们需要访问一些包或者protected可见性级别的 ...

  7. C++面向对象高级开发课程(第二周)

    1. 类中含有指针—— class with pointer member(s) ——的情况经常发生,典型的有:string 类. 2. STL中的 string 类太复杂,copy on write ...

  8. 04: 使用BeautifulSoup封装的xss过滤模块

    目录: 1.1 xss攻击简介 1.2 xss攻击解决方法 1.1 xss攻击简介返回顶部 1.简介 1. 跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS. ...

  9. 实现windows命令提示符的tab补全

    1:使用win+r打开 运行 控制台 2:输入 regedit 打开注册表 3:进入 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\C ...

  10. Visual Leak Detector简明使用教程

    Visual Leak Detector是一款内存泄漏检测软件,主要的作用就是检测可能或者是存在内存泄露的地方,具体的功能的话,可以百度下,今天主要简单介绍下怎么使用 首先下载Visual Leak ...