如何在玩笑中模拟重载方法?

时间:2020-05-12 12:58:28

标签: node.js typescript unit-testing jestjs

我正在使用jsonwebtoken库来验证模块中的令牌。 jsonwebtoken导出验证方法多次(重载)。

export function verify(token: string, secretOrPublicKey: Secret, options?: VerifyOptions): object | string;

export function verify(
    token: string,
    secretOrPublicKey: Secret | GetPublicKeyOrSecret,
    callback?: VerifyCallback,
): void;

export function verify(
    token: string,
    secretOrPublicKey: Secret | GetPublicKeyOrSecret,
    options?: VerifyOptions,
    callback?: VerifyCallback,
): void;

我的模块:

private validateToken(token: string): void {
        const publicKeyToPem = this.convertPublicKeyToPEM(this.ssoPublicKey);
        try {
            this.decodedToken = jwt.verify(token, publicKeyToPem);
        } catch (e) {
            throw new Error(e);
        }
    }

我试图在单元测试中模拟验证方法。

    test('should return true if token is correct', () => {

        const verifyResponse = { 'test': 'test' };
        jest.spyOn(jwt, 'verify').mockReturnValue(verifyResponse);

        ........
    });

我收到以下错误:类型'{test:string; }'不能分配给'void'类型的参数。ts(2345) 似乎使用了最后一个导出方法(验证),并且它返回void。 我尝试使用jest.spyOn(jwt, 'verify').mockImplementationOnce(() => verifyResponse);似乎不错,但是如何模拟特定的重载方法?

1 个答案:

答案 0 :(得分:0)

您应该像这样使用jest.spyOn而不是jest.mock

const jwt = require('jwt-library');
const myMod = require('./myModule');

// it will replace all of the methods with jest.fn()
jest.mock('jwt-library')

describe('my module', () => {
  const mockDecodedToken = { 'test': 'test' };
  describe('calling a public method that calls validateToken', () => {
    beforeAll(() => {
      jwt.verify.mockReturnValue(mockDecodedToken);
      myMod.aPublicMethodThatCallsValidateToken()
    })

    it('should have called jwt.verify', () => {
      expect(jwt.verify).toHaveBeenCalledWith(
        expect.any(String)
        expect.any(Secret)
        expect.any(VerifyOptions)
      )
    })

    it('should have assigned decodedToken to my module', () => {
      expect(myMod).toHaveProperty(decodedToken, mockDecodedToken)
    });
  })
})