测试辅助工具 Sinon Sinon 是一个独立的 JavaScript 测试 spy, stub, mock库,没有依赖任何单元测试框架工程。...object'); .include(value) / contains(value) value:Object | String | Number include() 和 contains() 即可作为属性类断言前缀语言链又可作为作为判断数组...API 介绍 辅助工具库 Sinon 主要有三个Api:spy, stub, mock spy 翻译过来的意思是 “监视”。...stub 使用 stub 来嵌入或者直接替换掉一些代码,来达到隔离的目的。stub 是代码的一部分。在运行时用 stub 替换真正代码,忽略调用代码的原有实现。...如果你曾经听过“mock 对象”这种说法,这其实是一码事 —— Sinon 的 mock 可以用来替换整个对象以改变其行为,就像函数 stub 一样。
——苏霍姆林斯基 之前写过自定义注解和AOP,但其是作用于方法上 今天用kotlin写一个作用在类上的:主要是@annotation换成@within package com.ruben.simpleboot
这时候就需要引入sinon来帮助我们替换掉这些难以模拟的逻辑。 sinon库提供了三种功能:spies、stub和mock。...spies作为sinon最简单的功能,它不会对被监听函数的执行过程造成任何影响,stub和mock功能都是基于spies实现的。...it('测试格式化函数', function(){ const stub = sinon.stub(db, 'query').returns({data: []}) const res = db.query...sinon.stub替换了db的query方法,并且控制了其返回值。...我们也可以让替换函数主动抛出错误,来测试调用它的函数是否可以正确处理异常: it('测试db操作失败', async function(){ const stub = sinon.stub(db,
var spy = sinon.spy(MyComp.prototype, 'componentDidMount');...expect(spy.callCount).toEqual(1); stub...有时候会使用stub来嵌入或者直接替换掉一些代码,来达到隔离的目的 一个stub可以使用最少的依赖方法来模拟该单元测试。...好的做法是使用stub 对它进行隔离替换。这样就实现了更准确的单元测试。...var myObj = { prop: function() { return 'foo'; } };sinon.stub(myObj, 'prop').callsFake(function...sinon 中有一些模拟 XMLHttpRequest 请求的方法, jest 也有一些第三方的库解决 fetch 的测试; 在我们的项目中,根据实际的用法,自己实现一个类来模拟请求的响应: //FakeFetch.jsimport
单元测试只能被单独使用在单个代码单元(类、函数)里;集成测试可以检查多个单元是否能按预期协同工作(组件层次结构、组件 + 存储);端到端测试则是从外部世界观察应用程序:浏览器及其交互。 2....describe 函数表示围绕测试单元组织测试用例:测试单元可以是类、函数、组件等。Mocha 没有内置的断言库,所以我们必须使用 Chai :它可以设置对结果的期望。...我们可以使用 find 选择器在渲染的 DOM 中搜索并获取它的 HTML、文本、类名或原生 DOM 元素。如果搜索的是一个可能不存在的片段,我们可以使用 exists 方法判断它是否存在。...import chai from 'chai'; import sinon from 'sinon'; import sinonChai from 'sinon-chai'; chai.use(sinonChai...); it('should set info coming from endpoint', async () => { const commit = sinon.stub(); sinon.stub
Sinon Sinon.JS 为 JavaScript 提供了独立的 spies、stubs 和 mocks [译者注:Spy、Stub 和 Mock 都是测试专用名词,Stub 常被翻译为桩,spies
单元测试部分介绍 先讲一下用到了哪些测试框架和工具,主要内容包括: jest ,测试框架 enzyme ,专测 react ui 层 sinon ,具有独立的 fakes、spies、stubs、mocks...from 'sinon'; import { fetcher } from '@/utils/fetcher'; import * as api from '@/services/bizApi';...bizApi */ describe('bizApi', () => { let fetcherStub; beforeAll(() => { fetcherStub = sinon.stub...fetcherStub.postJSON.lastCall.calledWith('/api/biz/get-table', payload)).toBe(true); }); }); 由于 api 层直接调用了工具库,所以这里用 sinon.stub...从以上整个过程可以看出,好的设计分层是很容易编写测试用例的,单元测试不单单只是为了保证代码质量:他会逼着你思考代码设计的合理性,拒绝面条代码 :muscle: 借用 Clean Code 的结束语: 2005
Node.js 中任何对象发出的事件都是 EventEmitter 类的实例,就像 http 模块。...所有 EventEmitter 类都可以使用 eventEmitter.on() 函数将事件侦听器附加到事件。然后一旦捕捉到这样的事件,就会同步地逐个调用它的侦听器。...如果文件相当大,用户不必等待很长时间直到读取整个内容,因为读取时会先向用户发送小块内容。...测试应用程序时使用 stub,模拟给定组件或模块的行为,你可以将精力集中在要测试的代码部分。通过使用 stub 代替与测试无关的组件,不必担心外部组件会影响结果。...在 Node.js 中,我们使用像 Sinon 这样的库来实现(译者注,Sinon 在测试中替换某部分代码,减少测试项编写的复杂度 https://sinonjs.org)。 14.
整个命令对于手工输入来说有些太长了,你可以把它作为一个npm script加入到package.json中: "scripts": { "test": "mocha --compilers js...避免在Sinon中使用箭头函数 与Mocha类似,在Sinon.js中使用箭头函数也可能导致问题。 问题出在sinon.test上。...解决方案是要么在使用sinon.test时避免使用箭头函数,要么通过beforeEach和afterEach来手工初始化和释放测试替身: var sandbox; beforeEach(() => {...sandbox = sinon.sandbox.create(); }); afterEach(() => { sandbox.restore(); }); it('should do something...with a sandbox', () => { // 与sinon.test类似,这个stub会自动被清理 var stub = sandbox.stub(); }); Mocha自带Promise
var spy = sinon.spy(MyComp.prototype, 'someMethod'); ......expect(spy.callCount).toEqual(1); 1.7 stub 有时候会使用stub来嵌入或者直接替换掉一些代码,来达到隔离的目的 一个stub可以使用最少的依赖方法来模拟该单元测试...好的做法是使用stub 对它进行隔离替换。这样就实现了更准确的单元测试。...var myObj = { prop: function() { return 'foo'; } }; sinon.stub(myObj, 'prop').callsFake...虽然 Jest 本身也有一些实现 spy 等的手段,但 sinon 使用起来更加方便。
这样做有以下优缺点: 优点 在开始可以比较明确自己要做什么,把错误暴露在整个开发流程比较靠前的位置,修改的成本也比较小 在之后对代码优化的过程中,因为有测试代码的存在,可以更好的优化代码,优化完之后再执行一遍代码...主要用来mock一些东西,比如可以用sinon mock一个假的函数,sinon也可以返回这个函数执行与否。...再执行以下安装语句: npm install sinon moncha chai sinon-chai --save-dev 复制代码 建立一个test文件夹,可以把写测试用例的Js放在这个文件夹中,...和 chai,要使用到sinon-chai const chai = require("chai") const sinon = require("sinon") const sinonChai =...模拟函数 如果需要模拟一个函数,可以用sinon去模拟,使用方法:sinon.fake(),并且课已通过这个sinon的called方法判断函数是否被执行。
通过本文,你可以解决以下问题: Jest与Sinon.js是什么? 如何配置Jest与Sinon.js,从而编写单元测试? 如何解决进行单元测试中遇到的常见问题?...Sinon.js配置 依赖包安装 安装配置完了Jest,让我们来看下Sinon.js。...需要使用Sinon.js,我们首先需要进行安装: npm install sinon -D 配置完成后,需要在使用的地方进行引入,如下所示: const sinon = require('sinon')...通过上面三类测试,我们基本能够覆盖现有项目中的所有代码。 同步函数测试 同步函数的测试过程是这几个中最简单的一部分,我们可以测试函数返回值,也能够测试传入的高阶函数。...正好Sinon.js能够做到这一点。
这个是可以显示整个工程所有类关系图的插件。...首先就是先点击下图中的3,因为这个是专门用于生成图的起始按钮 1:这里是按照对应的类还有模块还有包进行过滤,上面的小黄框就是对应的类,放大之后就是这样的 2:这里可以填写对应的过滤的类名或者包名 3:这里是专门生成整个图的...4.这里是对对应的类加上星,因为类图可能太多,为了查看自己想看的图,那么对自己想看的图添加星星,然后点击这个按钮,没有添加星星的类就会隐藏掉,用法就是在一个类上面点击右键。...5,点击后会立马将图按照正常尺寸充满画面 6,这个动画很好玩,它会根据你显示的类,进行生成一个图 最后还有一个不错的功能: 动画那个功能,类位置会一直在动,如果让其中一个类固定起来,可以选择星下面的那个按钮...还有个小功能: 对于用mac不用鼠标的,就是点击cmd+一只手指键盘,就可以整个画面拖动,小技巧 ===================================================
TDD vs BDD: TDD(Test Drivin Development)是测试驱动开发,强调的是一种开发方式,以测试来驱动整个项目,即先根据接口完成测试编写,然后在完成功能时要不断通过测试,最终目的是通过所有测试...基本上目前前端单元测试就在这两个库之间选了,下面是这两个库的区别,大家可以根据自己的需求进行选择: mocha: 优点: 终端显示友好 灵活,扩展性好 缺点: 自身集成度不高(没有断言,spy,异步等),而且经常要配合Chai,Sinon...两者功能覆盖范围粗略可以表示为: Jasmine(2.x) === Mocha + Chai + Sinon - mockserver PS: 个人实际使用后觉得Chai和Sinon毕竟是专门做特定功能的框架...,用 Mocha + Chai + Sinon 这种方式会想对舒爽一点。...which-javascript-test-library-should-you-use-qunit-vs-jasmine-vs-mocha/ http://thejsguy.com/2015/01/12/jasmine-vs-mocha-chai-and-sinon.html
对于最底层的子组件来说,我们可以很容易的将其进行渲染并测试其逻辑正确与否,但对于较上层的父组件来说,就需要对其所包含的所有子组件都进行预先渲染,甚至于最上面的组件需要渲染出整个 UI 页面的真实DOM节点才能对其进行测试...Enzyme理论上应该与所有TestRunner和断言库相兼容,已经集成了多种测试类库,比如Jest、Mocha&Chai、Jasmine,不过这些不是我们今天的重点。...it('simulates click events', () => { const onButtonClick = sinon.spy() const wrapper = shallow(.../> ) wrapper.find('button').simulate('click') expect(onButtonClick.calledOnce).to.be.true }) Sinon...则是一个可以用来Mock和Stub数据代码的第三方测试工具库,当我们需要检查一个组件当中某个特定的函数是否被调用时,我们可以使用sinon.spy()方法监视所传入该组件作为prop的onButtonClick
问题描述: MyEclipse中,导入maven项目, install后,仍有很多类报cannot be resolved to a type,如下图所示: ?...点击 OK,错误消失,感觉整个世界都清爽了!O(∩_∩)O哈哈~ 清爽界面如下图所示: ?
使用Promise.all时需要注意的是,如果其中任何一个请求失败,整个Promise.all调用都会失败。因此,在实际开发中,你可能需要对失败情况进行额外处理。...例如: const assert = require('assert'); const sinon = require('sinon'); // 这里无需引入 fetch,因为我们使用 sinon.stub...global.fetch) { global.fetch = () => {}; } fetchStub = sinon.stub(global,
from 'sinon'; global.expect = expect; global.sinon = sinon; 然后把它包括到 npm 脚本的运行套件中,并通过 --require ....现在无论什么时候,我们在写一个新的测试时,都不需要手动引入 expect 和 sinon。...一旦我们将 Karma 设置好了,在我们运行测试程序时,不仅是只有 babel-loader,而是整个 webpack config。这为我们提供了很多便利,使得我们的测试环境与开发环境相同。...': 'sinon/pkg/sinon' } }, module: { // don't run babel-loader through the...sinon module noParse: [ /node_modules\/sinon\// ], // run babel loader
领取专属 10元无门槛券
手把手带您无忧上云