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. Redis集群(一)

    redis是单线程,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了. 官方的一个简单测试: 测试完成了50个并发执行100000个请求. 设置和获取的值是一个256字节字符串. ...

  2. 170731、Nginx初探

    一. 概念 Nginx——Ngine X,是一款自由的.开源的.高性能HTTP服务器和反向代理服务器:也是一个IMAP.POP3.SMTP代理服务器:也就是说Nginx本身就可以托管网站(类似于Tom ...

  3. java 中的控制台端口的输入

    java 中基于控制台端的输入时最基本的操作. 第一步 导入Scanner类 import java.util.Scanner; 第二步 创建输入对象 input Scanner input=new ...

  4. 使用webmagic搭建一个简单的爬虫

    刚刚接触爬虫,听说webmagic很不错,于是就了解了一下. webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫. 这句话说的真的一点都不假 ...

  5. gnome,xfce,unity,vncserver chinese,jvm locale language

      __________________________ yum search vnc-server sudo yum install tigervnc-server vncserver -list ...

  6. nginx + ngx_lua安装测试

    nginx lua模块淘宝开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx的能力.nginx以高并发而知名,lua脚本轻便,两者的搭配堪称完美. ...

  7. Supermarket---poj456(贪心并查集优化)

    题目链接:http://poj.org/problem?id=1456 题意是现有n个物品,每个物品有一个保质期和一个利润,现在每天只能卖一个商品,问最大的利润是多少,商品如果过期了就不能卖了: 暴力 ...

  8. centos linux 系统日常管理4 scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法 第十七节课

    centos linux 系统日常管理4  scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法  第十七节课 rsync可以增量同步,scp不行 ...

  9. Spark Core(二)Driver上的Task的生成、分配、调度(转载)

    1. 什么是Task? 在前面的章节里描述过几个角色,Driver(Client),Master,Worker(Executor),Driver会提交Application到Master进行Worke ...

  10. WebService客户端几种实现方式

    1.jdk原生调用(需要获取服务接口文件) import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Ser ...