rewire typescript stub私有方法

时间:2018-03-27 05:26:33

标签: node.js typescript

我有以下文件进行测试

a.ts

export function a1(param1){
   a2(param1);
   return result;
}
function a2(param){
  return result2;
}

我正在尝试使用重新连接为导出的方法a1编写单元测试用例。以下是我的测试类

a_test.ts

const rewiredA= rewire('a');
rewiredA.__set__('a2', (token) => 'testmessage');

// Testing exported method of a.ts
rewiredA.__get__('a1')('param');

这里不是调用返回' testmessage'的存根私有方法,而是调用实际的私有方法。我的理解是当我们调用导出的函数时,模拟的私有方法将被执行。

请指导我。

2 个答案:

答案 0 :(得分:0)

  

我的理解是当我们调用导出的函数时,模拟的私有方法将被执行。

不正确的。如果某个功能未导出,则无法重新连接。

解决方案

导出您要重新连接的功能。您可以将其命名为_a2,以表示它是内部的。

答案 1 :(得分:0)

它应该适用于"rewire": "^4.0.1"。例如

a.js

function a1(param1) {
  return a2(param1);
}
function a2(param) {
  return 'result2';
}

a.test.js

const rewire = require('rewire');
const mod = rewire('./a');
const { expect } = require('chai');

describe('49504977', () => {
  it('a1', (done) => {
    mod.__with__(
      'a2',
      (token) => 'testmessage',
    )(() => {
      const actual = mod.__get__('a1')('param');
      expect(actual).to.be.eq('testmessage');
      done();
    });
  });

  it('a2', () => {
    const actual = mod.__get__('a2')();
    expect(actual).to.be.eq('result2');
  });
});

单元测试结果覆盖率100%:

  49504977
    ✓ a1
    ✓ a2


  2 passing (9ms)

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

源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/49504977