前端单元测试03之Sion

2023-11-18

前端单元测试03之Sion

  • 前端测试存在的问题
    在讲Sinon之前,我们得先讲一下在学习了Mocha、chai以及enzyme之后,我们的前端测试还存在的一些问题。
    比如前台测试需要与后台交互,获取后台数据后再根据相应数据进行测试。
    又比如一个函数测试依赖另一个函数,我们可以根据测试的目的去模拟另一个函数,讲两者的测试分开,从而达到测试中也能解耦的目的。
  • 测试辅助工具 Sinon
    Sinon是用来辅助我们进行前端测试的,在我们的代码需要与其他系统或者函数对接时,它可以模拟这些场景,从而使我们测试的时候不再依赖这些场景。
    Sinon有主要有三个方法辅助我们进行测试:spystubmock
  • Sion 的安装
npm install --save-dev sinon

官方demo:

export default function once(fn) {
    var returnValue, called = false;
    return function () {
        if (!called) {
            called = true;
            returnValue = fn.apply(this, arguments);
        }
        return returnValue;
    };
}
  • Sinon之spy
    spy生成一个间谍函数,它会记录下函数调用的参数,返回值,this的值,以及抛出的异常。
    而spy一般有两种玩法,一种是生成一个新的匿名间谍函数,另外一种是对原有的函数进行封装并进行监听。
    搭好上面的结构后,直接在once.test.js里面写入spy的使用例子:

    import {assert} from 'chai'
    import sinon from 'sinon'
    import once from '../src/once'
    
    describe('测试Once函数', function () {
      it('传入Once的函数会被调用', function () {
        var callback = sinon.spy();
        var proxy = once(callback);
    
        proxy();
    
        assert(callback.called);
      });
    })
    

    如上面代码所示,sinon.spy()会产生一个函数对象,当once调用这个函数对象后,这个函数对象通过called可以返回一个bool值,表示函数是否被调用。
    现在来看看spy的另一种玩法,即对原有函数的监控玩法,在once.test.js中加入以下测试用例:

	it('对原有函数的spy封装,可以监听原有函数的调用情况', function () {
    const obj={
        func:()=>{
            return 1+1
        }
    }
    sinon.spy(obj,'func')

    obj.func(3);

    assert(obj.func.calledOnce)
    assert.equal(obj.func.getCall(0).args[0], 3);
});
  • Sinon之Stub
    来看看Stub的官方介绍:

Test stubs are functions (spies) with pre-programmed behavior. They support the full test spy API in addition to methods which can be used to alter the stub’s behavior. As spies, stubs can be either anonymous, or wrap existing functions. When wrapping an existing function with a stub, the original function is not called.

stub是带有预编程行为的函数。
简单点说,就是spy的加强版,不仅完全支持spy的各种操作,还能操作函数的行为。
和spy一样,stub也能匿名,也能去封住并监听已有函数。
然而有一点和spy不同,当封装了一个已有函数后,原函数不会再被调用。

对于匿名的玩法我们就不说了,直接来封装的玩法,以下是对之前spy封装的修改:

it('对原有函数的stub封装,可以监听原有函数的调用情况,以及模拟返回', function () {
    const obj={
        func:()=>{
           console.info(1)
        }
    }
    sinon.stub(obj,'func').returns(42)

    const result=obj.func(3);

    assert(obj.func.calledOnce)
    assert.equal(obj.func.getCall(0).args[0], 3);
    assert.equal(result,43);
});

更多API查看Sinon之stub

  • Sinon之mock
    看一下官网的介绍

    Mocks (and mock expectations) are fake methods (like spies) with pre-programmed behavior (like stubs) as well as pre-programmed expectations.
    A mock will fail your test if it is not used as expected.

    it('mock的测试', function () {
        var myAPI = { 
            method: function () {
                console.info("运行method")
            },
            func: function () {
                console.info("运行method")
            }
        };
    
        var mock = sinon.mock(myAPI);
        mock.expects("method").once().returns(2);
        mock.expects("func").twice()
    
        myAPI.method();
        myAPI.func();
        myAPI.func();
    
        mock.verify();
    });
    

    在以上代码中,mock其实和stub很像,只不过是stub是对对象中单个函数的监听和拦截,而mock是对多个。
    mock首先会对函数进行一个预期:

    var mock = sinon.mock(myAPI);
       mock.expects("method").once().returns(2);
       mock.expects("func").twice()
    

    比如once就是预期运行一次,如果最终验证时函数没有被执行或者执行多次都会抛出错误。
    也可以操作返回结果,比如像stub一样returns(2)依然有效。
    而且与stub一样,在mock监听后,原有函数内容将不会执行。

    在进行了预期操作后,就对函数进行实际操作:

    myAPI.method();
    myAPI.func();
    myAPI.func();
    

    最后再进行验证操作:

    mock.verify();
    

总结

Sinon主要是一个测试辅助工具,通过伪装和拦截,来模拟与其他系统或函数的操作,可以解耦测试的依赖。
在上面只讲到了Sinon的spy、stub和mock三个函数,其实还有fake XHR(模拟xhr请求)、fack server(模拟服务器)以及fake timer(模拟定时器)等操作。这里就不多讲了,具体的可以查看此API:Sinon v4.1.6

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端单元测试03之Sion 的相关文章

随机推荐

  • Xshell ssh长时间连接不掉线设置

    1 Xshell客户端设置 2 服务器设置 vi etc ssh sshd config 把ClientAliveInterval 0和ClientAliveCountMax 3前的井号去掉 并把ClientAliveInterval的值改
  • Android 4.1 - 如何使用systrace做性能分析

    systrace是Android 4 1引入的一套用于做性能分析的工具 它基于Linux内核的ftrace机制 用于跟踪Linux内核的函数调用 可以输出各个线程当前的函数调用状态 并且可以跟当前CPU的线程运行状态 Display VSY
  • oracle 9i 手工建库,简单记录Oracle 9i数据库手工建库过程

    简单记录Oracle 9i数据库手工建库过程Oracle 9i手工建库 By Oracle老菜 今天客户要用oracle 9 2 0 5 aix 6 1已经不支持了 只好从别的数据库把软件拷贝过来重编译 但是建库只能用手工建库了 很久没有使
  • 如何找到计算机的网络凭据,输入网络凭据是什么(图文)

    导读 输入网络凭据是什么 下面就是191路由网整理的网络知识百科 来看看吧 大家好 我是191路由器网小编 上述问题将由我为大家讲解 以电脑为例 输入网络凭据就是为了访问网络资源存储在本机的账户和密码 当用户访问资源时 无须输入账户和密码就
  • 【error】DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80070002

    解决方案 Qt 中的多媒体播放 底层是使用DirectShowPlayerService 需要一个DirectShow解码器 例如LAV Filters LAV Filters的下载地址如下 http files 1f0 de lavf L
  • VMware下centos7开机登陆页面死循环问题详细解决

    一 问题描述 昨天安装东西 不了解捉瞎的时候在 etc profile下添加了几行export导入环境变量 结果重启虚拟机到用户登录页面 输入了正确的密码后还是出来的登陆页面 一直进不去 二 问题解决 查看博客发现大概率是更改 etc pr
  • linux中利用rsync实现文件增量同步

    inotify tools的安装和使用方法 使用inotify监控文件或目录变化 inotify是一种强大的 细粒度的 异步的文件系统事件监控机制 linux内核从 2 6 13 起 加入了inotify支持 通过inotify可以监控文件
  • Linux shell脚本中shift的用法说明

    Linux shell脚本中shift的用法说明 shift命令用于对参数的移动 左移 通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理 常见于Linux中各种程序的启动脚本 示例1 依次读取输入的参数并打印参数个数 r
  • Unity基础知识及一些基本API的使用

    Unity基础知识及一些基本API的使用 1 Unity界面介绍 Unity的默认Editor窗口主要呈现为以上布局 它们分别为 1 工具栏 工具栏提供最基本的工作功能 左侧的按钮用于访问 Unity Collaborate Unity 云
  • OC5228 100V多功能LED恒流驱动器-高辉调光 65536:1 调光比

    同脚位拼对拼替代智芯HI7001 磁吸灯 舞台灯电源方案新贵 概述 OC5228 是一款外围电路简单的多功能平均电流型LED 恒流驱动器 适用于5 100V 电压范围的降压BUCK 大功率调光恒流LED 领域 芯片PWM 端口支持超小占空比
  • React学习(懒加载)

    学习目标 提示 10分钟学会组件懒加载 1 路由懒加载 SPA应用中 为了优化首页加载和渲染性能 让路由页面组件按需访问加载 解决方案 路由懒加载 代码操作 编辑App jsx import App css 引入页面组件 import Lo
  • 太不可思议了,我的文章居然有人转载

    今天无意间逛Google 发现有人转载我的垃圾文章 简直不可思议 http www newbooks com cn info 50429 html 本来是写起耍的 算是整理加一点实际经验写成的 让我又高兴又惭愧 惭愧文章写的差 高兴我的文章
  • js遍历数组中的对象并拿到值

    拿到一组数组 数组中是对象 想拿到这个对象里面的某个值 可以参考以下例子 这样就拿到所有n1的值 想拿到这个对象里面所有对应的值如下 也可以这样取值 往数组里面push多个值 js中 用法 双叹号可以理解为将其强制类型转换为布尔值 例如 a
  • WebSocket协议深入理解

    1 WebSocket和HTTP的关系 WebSocket只有在建立握手连接的时候借用了HTTP协议的头 连接成功后的通信部分都是基于TCP的连接 总体来说 WebSocket协议是HTTP协议的升级版 2 研究WebSocket的思路 服
  • cortex-M3 异常-- SVC、PendSV介绍

    出处 http blog csdn net guozhongwei1 article details 49544671 问 ucos 任务切换时机 如何满足实时性 找上SVC PendSV啦 先了解下 以下出自 cortex M3权威指南
  • C语言中3种不同出错处理方式的优缺点

    这个是我在 数据结构习题集 上看到的一个习题 攒下来自己收藏 非原创 在程序设计中 常用下列三种不同的出错处理方式 1 用EXIT语句终止执行并报告错误 2 以函数的返回值区别正确返回或错误返回 3 设置一个函数变量的函数参数以区别正确返回
  • 移动开发!如何快速的开发一个完整的直播app,架构师必备技能

    金九银十过后各大网络平台都是各种面经分享 包括已收offer 或面试失败的都有 相信大部分人都拿到了自己心仪的大厂offer 不过也有没有少数没能进到自己内心向往的大厂而懊恼的 那么到底如何才能进大厂 该准备些什么才能进大厂 此时字节总监有
  • 有些so文件没有导入到lib目录问题解决

    在使用第三方sdk或者第三方库时 经常在libs目录下 会有一些so文件 比如高德地图的3Ddemo 就包含两个含有so文件的目录 而有的第三方不止两个目录的so文件 正常是这样子的 有多个文件目录的 但是 如果有的sdk只有两个关于so文
  • 给定一个数字范围,求一个数出现的次数

    题目 输入 29 33 3 输出 5 3出现5次 import sys def find lis start lis 0 end lis 1 m lis 2 n 0 for i in range start end 1 j i while
  • 前端单元测试03之Sion

    前端单元测试03之Sion 前端测试存在的问题 在讲Sinon之前 我们得先讲一下在学习了Mocha chai以及enzyme之后 我们的前端测试还存在的一些问题 比如前台测试需要与后台交互 获取后台数据后再根据相应数据进行测试 又比如一个