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

spy函数未被触发调用,单元测试中如何正确监听导入的functionIWantToSpy?

问题根因
  • auditEvent.js内部调用的functionIWantToSpy是它自己从@mycompany/another-lib导入的实例,你在测试文件单独导入的函数和它不是同一个引用,直接对测试文件里的函数做spy,完全监听不到auditEvent内部的调用
  • 你当前只通过proxyquire替换了验证库的依赖,没有替换@mycompany/another-lib的依赖,导致auditEvent加载的还是原包的原始函数
  • 现有代码存在多处笔误:proxyquire中填写的包名@mycompny/verify-lib拼写错误(缺字母a)、spy变量名拼写错误、it用例的语法括号位置错误
修复后的测试代码
const sinon = require('sinon');
const proxyquire = require('proxyquire');
const { expect } = require('chai');

describe('mytest', () => {
  let spiedFunction;
  let verifyStub;

  beforeEach(() => {
    verifyStub = sinon.stub();
    // 提前创建要监听的spy实例
    spiedFunction = sinon.spy();
    ({auditEvent} = proxyquire('./auditEvent', {
      // 修复包名拼写错误
      '@mycompany/verify-lib': {
        verify: verifyStub,
        '@noCallThru': true,
      },
      // 新增another-lib的依赖替换,把auditEvent导入的函数替换为我们的spy实例
      '@mycompany/another-lib': {
        functionIWantToSpy: spiedFunction,
        '@noCallThru': true
      }
    }));
  });

  // 修复it用例的括号语法错误
  it('should work', async () => {
    auditEvent();
    // 对spy实例做调用次数断言
    expect(spiedFunction).to.have.callCount(1);
  });
});
核心改动说明
  • 在proxyquire的依赖替换规则里新增@mycompany/another-lib的配置,让auditEvent.js加载的时候直接拿到我们提前创建好的spy实例,这样内部调用的就是被监听的函数,调用次数就能正常统计
  • 修复所有语法、拼写错误,保证测试代码可以正常执行
  • 直接对spy实例做断言,不需要再引用原包导出的函数

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 11:48:04