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. RedisDesktopManager 打开报0xc000007b程序错误

    RedisDesktopManager 是一个管理redis的工具,很好用,我的电脑可以安装0.8.3版的,最新版到0.9.4了,其中经典版本是0.8.8,可惜0.8.3版之后,我的电脑安装软件后,打 ...

  2. Centos6与Centos7的区别

    前言 centos7与6之间最大的差别就是初始化技术的不同,7采用的初始化技术是Systemd,并行的运行方式,除了这一点之外,服务启动.开机启动文件.网络命令方面等等,都说6有所不同.让我们先来了解 ...

  3. Windows环境下手动更新boot2docker.iso

    GitHub连不上导致自动更新失败. https://github.com/boot2docker/boot2docker/releases 替换了DockerToolbox安装目录和系统盘用户目录\ ...

  4. git-【八】多人协作

    当你从远程库克隆时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin. 要查看远程库的信息 使用 git remote 要查看远程库的详 ...

  5. 前端基础(JavaScript)2

    3.2 Array对象 3.2.1 数组创建 创建数组的三种方式: 创建方式1: var arrname = [元素0,元素1,….]; // var arr=[1,2,3]; 创建方式2: var ...

  6. C# Winform backgroundWorker组件使用

    BackgroundWorker 组件用来执行诸如数据库事务.文件下载等耗时的异步操作. 开始 在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序: ...

  7. 使用RequireJS并实现一个自己的模块加载器 (二)

    2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...

  8. 22. Generate Parentheses(回溯)

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  9. Terminal(终端) 在 OS X下如何快速调用

    Terminal(终端) 在 OS X下如何快速调用 转载请注明原作者:文章如果对您有所启发或帮助,不介意您请我喝一杯咖啡 ​ Terminal作为人机交流中极其重要的一部分,无论是在Windows. ...

  10. express 项目前后台公用样式 /static/js/bootstrap.min.js

    express  项目前后台公用样式 /static/js/bootstrap.min.js