如何使用sinon在我的路由中存根内部函数

时间:2020-04-17 14:32:32

标签: node.js typescript express sinon sinon-chai

我有内部功能

//in greatRoute.ts
async function _secretString(param: string): Promise<string> {
   ...
}

router
  .route('/foo/bar/:secret')
  .get(
    async (...) => {
      ...
      const secret = _secretString(res.params.secret);
      ...
    },
  );

export default {
  ...
  _secretString
};

现在我正尝试使用sinon.stub模拟呼叫:

sinon.stub(greatRoute, '_secretString').resolves('abc');

但是,这并不符合我想要的方式。当我在测试中调用路由时,它仍会进入_secretString函数。我在这里想念什么吗?我已经尝试将导出文件放在函数标头的前面,如下所示: export async function _secretString(param: string): Promise<string> 而不是进行export default {...},但这没有帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用rewire软件包对 app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "MyArea", pattern: "C:/WebApplication7/MS/{area:exists}/Views/{controller=Home}/{action=Index}.cshtml"); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapBlazorHub(); }); 函数进行存根。例如

_secretString

index.ts

async function _secretString(param: string): Promise<string> { return 'real secret'; } async function route(req, res) { const secret = await _secretString(req.params.secret); console.log(secret); } export default { _secretString, route, };

index.test.ts

具有覆盖率报告的单元测试结果:

import sinon from 'sinon';
import rewire from 'rewire';

describe('61274112', () => {
  it('should pass', async () => {
    const greatRoute = rewire('./');
    const secretStringStub = sinon.stub().resolves('fake secret');
    greatRoute.__set__('_secretString', secretStringStub);
    const logSpy = sinon.spy(console, 'log');
    const mReq = { params: { secret: '123' } };
    const mRes = {};
    await greatRoute.default.route(mReq, mRes);
    sinon.assert.calledWithExactly(logSpy, 'fake secret');
    sinon.assert.calledWith(secretStringStub, '123');
  });
});