You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:10:57