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
相关产品推荐
相关产品推荐

