https://relishapp.com/rspec/rspec-mocks/v/3-7/docs/basics/test-doubles

你有一个问题,如果想为程序添加一个信用卡程序用于自己挣钱。测试信用卡函数很难。你不像在测试时,真来一个信用卡购买。而且网络远程调用很慢。

或者你有另一个问题。你想要使用模块设计来开发代码。你想要你的测试尽可能的和其他相关的部分的代码隔离开。 比如你有一个业务逻辑会调用一个model,但是你的测试不想用这个model,你想要你的workflow test有效,但和这个model无关,假定这个model不存在或坏掉。

解决以上问题的方案是a test double.这是一个fake object,在自动化测试中用于取代一个真实的object。所谓假fake,就是这个对象不是一个真实的implementation工具。但是它可以取代那些已装罐的values,并可以返回对指定信息的回复。

Test double也有小issue,作者会给出解释,怎么用自己决定。

开始讲运作方式,(使用rspec-mocks library),然后讨论不同的方法使用来解决上面的2个问题,最后在12章Minitest,会讲解相关用法。


  • Test doubles defined✅
  • creating Stubs✅
  • Mock Expectations✅
  • Using Mocks to simulate database Failure✅
  • Using Mocks to Specify behavior✅
  • More expectation annotations注释简单看了
  • Mock Tips(窍门,a useful piece of advise)  简单看了

Test Doubles Defined

a fake是一个典型的Ruby对象,被专门设计用于测试的。

A stub是一个fake,针对一个方法调用返回预先决定的值,而不是在一个实际的对象调用实际的方法。

使用double方法创建a stub 桩件。或者创建一个partial stub通过使用特殊的方法在一个已存在的对象中:

allow(thing).to receive(:name).and_return("Fred")

解释:调用thing.name,得到Fred作为结果

重点是,thing.name方法默认是没有touched(我的理解是被建立),所以无论真实方法会返回什么值都无关重要。Fred作为回复来自于stub,而stub不是真实的对象。

A mock 驭件:stub类似,但是还会返回the fake value。一个mock对象建立一个可测试的期待。如果这个方法没有被调用,mock会发出测试失败信息。用expect取代allow

expect(thing).to  recceive(:name).and_return( "Fred" )

使用mock,然后调用thing.name, 仍会得到Fred并且thing.name方法也untouched.

区别:

但是在测试中,如果你不调用thing.name,测试会失败并提供一个error信息。


Creating Stubs

A stub用于取代一个对象的全部或部分,防止一个普通的方法调用发生,作为替代当stub被创建时返回一个预制的value。

RSpec,有2个类型的stubs。full doubles, partical doubles.

a partical double 在什么情况下使用:创建一个对象但有几个方法想要bypass。

a full double使用范围:当测试时,你的代码和a specific API一起工作,而不是一个对象的时候。

Full Doubles (mock/stub)

创建一个假的对象和其假方法。

下面是一个愚蠢的expect()例子,只用与说明double的定义。

it "can create doubles" do

twin = double(first_name: "Paul", weight: 100)

expect(twin.first_name).to eq("Paul")

end

double(参数1,参数2)

#参数1 是一个可选的string,作为名字,参数2是key/value pairs 代表传送给double的信息。上一个double没有名字。

allow and expect方法:

twin = double(first_name: "Paul", weight: 100) 等同于

Rails 5 Test Prescriptions 第7章 double stub mock的更多相关文章

  1. Rails 5 Test Prescriptions 第11章其他部分的测试。

    Routes✅ Helper Methods✅ Controllers and Requests✅ Simulating Requests⚠️,看之前的博客 What to Expect in a R ...

  2. Rails 5 Test Prescriptions 第9章 Testing-JavaScript: Integration Testing,❌挂一个问题webpacker::helper

    使用Capybara进行JS的集成测试 谈论驱动 让测试通过 Webpack in Development Mode Js设计 是用户在网页上有好的体验的重要因素. 尽管如此,许多网页不测试JS. 部 ...

  3. Rails 5 Test Prescriptions 第8章 Integration Testing with Capybara and Cucumber

    Capybara:  A complete reference is available atrubydoc.info. 集成测试就是把局部的程序组合起来测试. 端到端测试是一个特殊的集成测试,覆盖了 ...

  4. Rails 5 Test Prescriptions 第5章 Testing Models

    Rails,model层包含业务逻辑和储存逻辑.其中储存逻辑被ActiveRecord处理. 在model中,不是每件事都必须是ActiveRecord对象.model layer可以包含各种服务,对 ...

  5. Rails 5 Test Prescriptions 第4章 什么制造了伟大的测试

    伴随着程序成长,测试变长,复杂性增加,如何更高效的写测试,对以后开发不会造成麻烦. 测试本身没发被测试,所以一定要清楚,可控.不要加循环,不要过于复杂的自动编程. Cost and Value 成本和 ...

  6. Rails 5 Test Prescriptions 第3章Test-Driven Rails

    本章,你将扩大你的模型测试,测试整个Rails栈的逻辑(从请求到回复,使用端到端测试). 使用Capybara来帮助写end-to-end 测试. 好的测试风格,包括端到端测试,大量目标明确的单元测试 ...

  7. Rails 5 Test Prescriptions 最后一章,如何测试继承下来的代码,legacy code

    Set expectations 你不可能把一个老旧的代码野兽只用一晚就转变成优雅的奇迹marvel.你需要如下做法: 让自己有好的状态,用15分钟挥舞拳头诅咒之前的程序员 开始工作,这个codeba ...

  8. Rails 5 Test Prescriptions 第10章 Testing for Security

    Web 安全是一个可怕的主题.所有的你的程序都依靠密码学,代码超出了你的控制. 尽管如此,你还是可以控制部分网页安全 --所有的logins和access checks和injection error ...

  9. Rails 5 Test Prescriptions 第10章 Unit_Testing JavaScript(新工具,learn曲线太陡峭,pass)

    对Js的单元测试是一个大的题目.作者认为Ruby的相关测试工具比Js的测试工具更灵活 大多数Js代码最终是关于响应用户的行为和改变DOM中的元素 没有什么javascript的知识点.前两节用了几个新 ...

随机推荐

  1. 【深拷贝VS浅拷贝】------【巷子】

    1.回顾 数据传递的方法: 值传递:基本数据类型的数据不会发改变,因为基本数据类型一般存放在栈里面,值传递只是将数据拷贝了一份给另一个变量 引用传递:会改变内存中的数据,因为引用类型的数据都存放在堆里 ...

  2. java web 打印(lodop)案例

    应需求接触到lodop 打印. 首先在lodop官网下载相关文件(js.css等):http://www.lodop.net/download.html 在下载好的包里  除了html页面  其他的j ...

  3. Chinese_remainder_theorem

    https://en.wikipedia.org/wiki/Chinese_remainder_theorem 中国剩余定理 https://en.wikipedia.org/wiki/RSA_(cr ...

  4. Python开发【笔记】:为什么pymysql重连后才能查到新添加的数据

    PyMysql操控 问题描述: 之前做数据库模块的时候用到了pymysql,测试中发现了一个问题,创建两个程序,select.py从数据库中不断的读取,insert.py在数据库中插入多条数据,但是s ...

  5. Android之上下文context

    Context,中文直译为“上下文”,SDK中对其说明如下: 1.它描述的是一个应用程序环境的信息,即上下文. 2.该类是一个抽象(abstract class)类,Android提供了该抽象类的具体 ...

  6. CF734F Anton and School 构造+数论

    正解:构造 解题报告: 先放下传送门QwQ 这题首先要知道一个结论:(x&y)+(x|y)=x+y 还是能理解的趴? 所以我们把bi+ci就能得到∑a+n*a[i] 然后我们就能成功求出∑a ...

  7. form表单上传图片问题:线下可以而线上不可以

    由于上传图片需要一定时间,而线下速度快线上速度慢. 所以如果你的上传窗口是弹出界面,那么就会面临上传未完成就关闭了该界面.导致上传失败.

  8. grep命令做永久别名 显示颜色

    grep命令做永久别名  显示颜色 http://jingyan.baidu.com/article/22fe7ced17c1543002617f9c.htmlhttp://blog.csdn.net ...

  9. Spring源码解析(四)Bean的实例化和依赖注入

    我们虽然获得了Bean的描述信息BeanDefinition,但是什么时候才会真正的实例化这些Bean呢.其实一共有两个触发点,但是最后实际上调用的是同一个方法. 第一个:在AbstractAppli ...

  10. Django model中数据批量导入bulk_create()

    在Django中需要向数据库中插入多条数据(list).使用如下方法,每次save()的时候都会访问一次数据库.导致性能问题: for i in resultlist: p = Account(nam ...