ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在 Mocha 中配置 sinon-chai:从零搭建单元测试环境的完整教程

在 Mocha 中配置 sinon-chai:从零搭建单元测试环境的完整教程 在 Mocha 中配置 sinon-chai从零搭建单元测试环境的完整教程【免费下载链接】sinon-chaiExtends Chai with assertions for the Sinon.JS mocking framework.项目地址: https://gitcode.com/gh_mirrors/si/sinon-chaisinon-chai 是一个扩展 Chai 断言库的插件专为 Sinon.JS 模拟框架提供一整套人话级断言让 spy、stub、mock 的验证代码既简洁又易读。本文手把手教你从零开始在 Mocha 测试框架中完成 sinon-chai 配置一步步搭建出可复用的单元测试环境并附上实战案例与避坑指南。✅ 你将学会安装并初始化 Mocha Chai Sinon sinon-chai用should和expect两种接口写出优雅断言掌握调用次数、参数、返回值等核心断言写法排查最常见的配置与使用报错为什么单元测试需要 sinon-chai在单元测试中我们经常要验证某个函数被调用了几次、传了什么参数。用原生 Sinon 写是这样sinon.assert.calledWith(mySpy, foo);用 Chai 的原始接口写又很别扭expect(mySpy.calledWith(foo)).to.be.ok;而有了 sinon-chai你可以直接写成自然语言般的断言expect(mySpy).to.have.been.calledWith(foo);验证需求原生写法sinon-chai 写法被调用过sinon.assert.called(spy)spy.should.have.been.called传参正确sinon.assert.calledWith(spy, foo)expect(spy).to.have.been.calledWith(foo)调用次数sinon.assert.callCount(spy, 3)spy.should.have.callCount(3)这就是 sinon-chai 的价值断言可读性大幅提升测试失败信息也更友好。搭建 Mocha 单元测试环境最简安装清单首先准备一个 Node.js 项目目录然后安装全部依赖npm init -y npm install --save-dev mocha chai sinon sinon-chai 版本提示sinon-chai 的 peer 依赖要求chai ^5.0.0 || ^6.0.0、sinon 4.0.0直接用最新版即可。接着在package.json中配置测试命令{ scripts: { test: mocha } }在 Mocha 中配置 sinon-chai两种最快配置方法核心配置只需要一行chai.use(sinonChai)。下面给出最常用的两种接口写法。方法一expect 接口推荐新手使用// setup.js import * as chai from chai; import sinonChai from sinon-chai; chai.use(sinonChai); export const expect chai.expect;方法二should 接口链式写法更自然// setup.js import * as chai from chai; import sinonChai from sinon-chai; chai.use(sinonChai); chai.should();然后在 Mocha 启动时加载这个配置文件在package.json或.mocharc.json中指定{ spec: [test/**/*.test.js], require: [setup.js] } 项目自身的测试就是这么做的参考 test/common.js 中的初始化写法加载配置后再chai.should()即可全局生效。必学核心断言调用次数与参数匹配sinon-chai 把 Sinon 几乎所有的 spy 方法都转成了 Chai 断言最常用的是这几类验证调用次数spy.should.have.been.calledOnce; // 恰好一次 spy.should.have.been.calledTwice; // 恰好两次 spy.should.have.callCount(5); // 精确次数 spy.should.have.been.called; // 至少一次 spy.should.have.not.been.called; // 从未被调用验证调用参数expect(spy).to.have.been.calledWith(foo, 42); expect(spy).to.have.been.calledWithExactly(foo, 42); // 参数完全一致 expect(spy).to.have.been.calledWithMatch(sinon.match.number); expect(spy).to.have.been.calledOnceWith(foo);验证返回值与异常spy.should.have.returned(result); spy.should.have.thrown(Error);验证调用顺序与上下文spy1.should.have.been.calledBefore(spy2); spy1.should.have.been.calledAfter(spy2); spy.should.have.been.calledOn(expectedThis); 完整断言清单见项目 README包括calledWithNew、calledImmediatelyBefore等进阶用法。实战案例用 stub 模拟依赖并测试回调下面用一个完整的 Mocha 测试用例演示被测函数调用回调stub 模拟外部依赖然后用 sinon-chai 验证行为。import sinon from sinon; import { expect } from ./setup.js; function fetchUser(id, callback) { // 模拟真实业务逻辑 callback(user- id); } describe(fetchUser, () { it(应以正确参数调用回调, () { const cb sinon.spy(); fetchUser(42, cb); expect(cb).to.have.been.calledOnce; expect(cb).to.have.been.calledWith(user-42); }); it(stub 应被调用且返回指定值, () { const api { get: sinon.stub().returns({ name: Alice }) }; api.get(/user/1); expect(api.get).to.have.been.calledWith(/user/1); expect(api.get.returnValues[0]).to.deep.equal({ name: Alice }); }); });运行npm test全部用例应通过。常见报错与避坑指南❌ TypeError: xx is not a spy or a call to a spy!原因断言的目标对象不是 spy/stub/mock。检查你是否对普通函数做了断言或sinon.spy()没有正确包裹目标。该错误信息来自 lib/sinon-chai.js 中的assertCanWorkWith校验逻辑。❌ 忘记加载插件导致断言不生效报错xxx.calledWith is not a function多半是忘了执行chai.use(sinonChai)或配置加载文件没被 Mocha 引入。⚠️always关键字的位置should.have.been.alwaysCalledWith是错误写法正确写法是spy.should.always.have.been.calledWith(foo);⚠️ 取反用.not想断言未被调用用 Chai 的.notspy.should.have.not.been.called;深入源码看懂 sinon-chai 的实现原理想真正理解这个插件可以阅读它的源码和测试插件主体lib/sinon-chai.js——通过chai.use注册断言逐个把 Sinon 方法挂到chai.Assertion.prototype上初始化示例test/common.js——展示了标准的加载方式核心测试test/callArguments.js、test/callCount.js——覆盖了所有断言的边界场景想跑通项目自带测试可先克隆仓库查看完整测试套件git clone https://gitcode.com/gh_mirrors/si/sinon-chai然后按 package.json 中的脚本执行npm install和npm test使用 c8 mocha 生成覆盖率报告。总结到这里你已经完成了从零搭建 Mocha 单元测试环境的全部步骤安装依赖 → 初始化 sinon-chai → 编写 spy/stub 断言 → 排查常见错误。sinon-chai 把 Sinon 的强大能力和 Chai 的可读性结合得天衣无缝是前端与 Node.js 项目单元测试的黄金搭档。现在就去你的项目里试试吧【免费下载链接】sinon-chaiExtends Chai with assertions for the Sinon.JS mocking framework.项目地址: https://gitcode.com/gh_mirrors/si/sinon-chai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表