SinonStub函数观察器

时间:2019-06-19 22:04:11

标签: javascript typescript chai sinon

我尝试通过sinon.js测试快速中间件

我想测试,它发送给响应特定的JSON,并且不要让请求进入下一个中间件或请求处理程序。

const middleware = (req: Request, res: Response, next: NextFunction) => {
  setTimeout(() => res.json({status: 'blocked'}), 1000);
}

对于模拟请求和响应,我使用sinon-express-mock。因此,Response对象中的每个属性和方法都是SinonStub

我的问题是,当我调用中间件并调用方法json时,我不知道如何在调用中间件后对其进行检查。

SinnStub上有监听器或观察器吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

这是单元测试解决方案:

index.ts

import { NextFunction, Response, Request } from 'express';

const middleware = (req: Request, res: Response, next: NextFunction) => {
  setTimeout(() => res.json({ status: 'blocked' }), 1000);
};

export { middleware };

index.test.ts

import { middleware } from './';
import { Request } from 'express';
import sinon, { SinonFakeTimers } from 'sinon';

describe('56676480', () => {
  let clock: SinonFakeTimers;
  before(() => {
    clock = sinon.useFakeTimers();
  });
  after(() => {
    clock.restore();
  });
  it('should pass', () => {
    const mReq = {} as Request;
    const mRes = { json: sinon.stub() } as any;
    const mNext = sinon.stub();
    middleware(mReq, mRes, mNext);
    clock.tick(1000);
    sinon.assert.calledWithExactly(mRes.json, { status: 'blocked' });
  });
});

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

  56676480
    ✓ should pass


  1 passing (12ms)

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