Proxyquire 不覆盖导出的函数

Proxyquire not overriding exported function

我有一个 class modules/handler.js,看起来像这样:

const {getCompany} = require('./helper');

module.exports = class Handler {
    constructor () {...}
    async init(){
        await getCompany(){
        ...
    }
}

它从文件 modules/helper.js:

中导入函数 getCompany
exports.getCompany = async () => {
 // async calls
}

现在在集成测试中,我想存根 getCompany 方法,它应该只是 return 一个 mockCompany。 但是,proxyquire 并没有对方法 getCompany 进行存根,而是调用了真正的方法。 测试:

const sinon = require('sinon');
const proxyquire = require("proxyquire");
const Handler = require('../modules/handler');

describe('...', () => {

    const getCompanyStub = sinon.stub();
    getCompanyStub.resolves({...});

    const test = proxyquire('../modules/handler.js'), {
      getCompany: getCompanyStub
    });

    it('...', async () => {
        const handler = new Handler();
        await handler.init(); // <- calls real method 
        ... 
    });
});

我也在没有 sinon.stub 的情况下尝试过它,其中代理需要 return 一个函数直接 returning 一个对象,但是,这也没有用。

我将非常感谢您的每一个指点。 谢谢。

您正在使用的 Handler class 是 require 函数所必需的,而不是 proxyquire

handler.js:

const { getCompany } = require('./helper');

module.exports = class Handler {
  async init() {
    await getCompany();
  }
};

helper.js:

exports.getCompany = async () => {
  // async calls
};

handler.test.js:

const sinon = require('sinon');
const proxyquire = require('proxyquire');

describe('69759888', () => {
  it('should pass', async () => {
    const getCompanyStub = sinon.stub().resolves({});
    const Handler = proxyquire('./handler', {
      './helper': {
        getCompany: getCompanyStub,
      },
    });
    const handler = new Handler();
    await handler.init();
  });
});

测试结果:

  69759888
    ✓ should pass (2478ms)


  1 passing (2s)

------------|---------|----------|---------|---------|-------------------
File        | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
------------|---------|----------|---------|---------|-------------------
All files   |     100 |      100 |     100 |     100 |                   
 handler.js |     100 |      100 |     100 |     100 |                   
 helper.js  |     100 |      100 |     100 |     100 |                   
------------|---------|----------|---------|---------|-------------------