如何用Sinon模拟getPass函数并断言global.pass(JS单元测试)
我来帮你搞定这个测试需求!要模拟getPass()并断言global.pass的变化,用Sinon的stub就能轻松实现,结合Mocha和Chai的expect语法,下面是完整的测试方案:
第一步:确认依赖安装
首先确保你已经装好所需工具:
npm install mocha chai sinon --save-dev
第二步:编写测试用例
创建测试文件(比如app.test.js),代码如下:
const { expect } = require('chai'); const sinon = require('sinon'); const app = require('./app'); describe('saveInGlobal function', () => { // 每个测试前重置全局变量,避免测试间污染 beforeEach(() => { global.pass = 'initial-value'; // 满足原函数的执行条件(非空非null) }); afterEach(() => { // 恢复被Stub的方法,避免影响其他测试 sinon.restore(); // 清理全局变量 delete global.pass; }); it('should update global.pass with the mocked value from getPass', async () => { // 1. 用Sinon Stub模拟getPass的返回值 const mockedPassword = 'my-custom-mocked-pass'; sinon.stub(app, 'getPass').resolves(mockedPassword); // 2. 调用要测试的目标函数 await app.saveInGlobal(); // 3. 断言全局变量是否被正确更新 expect(global.pass).to.equal(mockedPassword); // 额外验证:确认getPass确实被调用了一次 expect(app.getPass.calledOnce).to.be.true; }); it('should skip updating when global.pass is empty', async () => { // 测试分支场景:当global.pass为空时,不执行逻辑 global.pass = ''; const getPassStub = sinon.stub(app, 'getPass'); await app.saveInGlobal(); expect(getPassStub.called).to.be.false; expect(global.pass).to.equal(''); // 保持原值不变 }); });
关键细节解释
- Sinon Stub的使用:因为
getPass是异步函数,所以用resolves()指定它的异步返回值;如果要模拟失败场景,可以用rejects(new Error('test error'))。 - 测试隔离:
beforeEach和afterEach用来重置全局变量、恢复Stub,确保每个测试用例都是独立的,不会互相干扰。 - 额外断言:通过
calledOnce验证getPass的调用情况,让测试逻辑更严谨,避免漏测分支。
⚠️ 小提示:你的app.js里有个大小写不一致的问题——saveInGlobal里调用的是module.exports.getpass()(小写p),但导出的方法是getPass(大写P),这会导致运行时报错,建议统一方法名哦!
内容的提问来源于stack exchange,提问作者N Sharma
相关产品推荐
相关产品推荐

