开玩笑的 request.res.setHeader 总是返回错误 - 不是函数

时间:2021-07-19 20:40:58

标签: unit-testing testing jestjs mocking nestjs

我的登录方法使用 request.res.setHeader() 返回标头中的刷新令牌信息,在单元测试中,我尝试模拟此函数,但总是出现错误 - "TypeError: request.res.setHeader is not a function ",如果我删除此 request.res.setHeader(...) 行,则测试通过。以下是我的请求模拟脚本:

export const mockRequest = {
  user: readerStub(),
  res: jest.fn().mockImplementation(() => {
    return { setHeader: jest.fn() };
  }),
};

谁能告诉我这里有什么问题?

完整的登录单元在这里

async login(request) {
    const readerID = request.user._id;
    const accessToken = this.getJwtAccessToken(readerID);
    const refreshToken = this.getCookieJwtRefreshToken(readerID);
    await this.setRefreshToken(refreshToken[1], readerID);
    request.res.setHeader('Set-Cookie', refreshToken[0]);
    //create the log for success activity
    this.logger.info(`Success login for reader ${request.user.username}`);
    return {
      token_info: accessToken,
      expireIn: process.env.ACCESS_TOKEN_TIMER,
    };
  }

单元测试代码在这里

describe('login', () => {
    describe('when login is called', () => {
      let token: TAccessToken;

      beforeEach(async () => {
        jest
          .spyOn(readerService, 'getJwtAccessToken')
          .mockImplementationOnce(() => accessTokenStub().token_info);
        jest
          .spyOn(readerService, 'getCookieJwtRefreshToken')
          .mockImplementationOnce(() => {
            return [
              refreshTokenStub().refreshToken_Cookie,
              refreshTokenStub().refreshToken,
            ];
          });
        jest
          .spyOn(readerService, 'setRefreshToken')
          .mockImplementationOnce(async () => Promise.resolve('OK'));
        token = await readerService.login(mockRequest);
      });

      test('then it should call setRefreshToken', () => {
        expect(readerService.setRefreshToken).toHaveBeenCalledWith(
          refreshTokenStub().refreshToken,
          readerStub()._id,
        );
      });

      test('then it should return a access token in body', () => {
        expect(token).toEqual(accessTokenStub());
      });
    });
  });

1 个答案:

答案 0 :(得分:0)

res 本身不是函数,所以当你执行 res: jest.fn()... 时你永远不会进入模拟,因为它没有被称为 res(),它只是被称为 {{1 }}。而不是做 res.setHeader 你应该做 res: jest.fn().mockImplementation(()=> ({ setHeader: jest.fn() }))