如何使用 jest 处理单元测试用例中的异步 Rest 错误

How to handle async Rest Error in unit test cases using jest

以下是我的节点js测试文件代码,这是一个单元测试用例,它失败了。请在下面找到详细的代码和错误消息。

jest.unmock('./utils.js');
describe('test', () => {
     it('test', async (done) => {
        await expect(getAPISecretKey('testKey')).rejects.toEqual('RestError: AKV10000: Request is missing a Bearer or PoP token.');
     });
 });

失败并出现以下错误

FAIL  src/utils.test.js
  ● test › test

    expect(received).rejects.toEqual(expected) // deep equality

    Expected: ["RestError: AKV10000: Request is missing a Bearer or PoP token."]
    Received: [RestError: AKV10000: Request is missing a Bearer or PoP token.]

       6 |      it('test', async (done) => {
    >  7 |         await expect(getAPISecretKey('testKey')).rejects.toEqual(error);
         |                                                          ^
       8 |      });
       9 |  });
      10 | 

      at Object.toEqual (node_modules/expect/build/index.js:241:20)
      at Object.<anonymous> (src/utils.test.js:7:58)

我尝试了以下方法,但仍然没有用。

jest.unmock('./utils.js');
describe('test', () => {
     var error = ['RestError: AKV10000: Request is missing a Bearer or PoP token.'];
     it('test', async (done) => {
        await expect(getAPISecretKey('testKey')).rejects.toEqual(new Error('Request is missing a Bearer or PoP token.'));
     });
 });

获取APISecretKey的代码

async function getAPISecretKey(secretNameStr) {
    let credentials = getKeyVaultCredentials();
    let keyVaultClient = new SecretClient(KEY_VAULT_URL, credentials);
    let secret = await keyVaultClient.getSecret(secretNameStr);
    return secret.value;
}

试了下面的方法报错如下

jest.unmock('./utils.js');
describe('test', () => {
  //toEqual('RestError: AKV10000: Request is missing a Bearer or PoP token.');
     it('test', async (done) => {
        await expect(getAPISecretKey('testKey')).rejects.toThrow('AKV10000: Request is missing a Bearer or PoP token.');
     });
 });

错误:

 FAIL  src/utils.test.js (14.891 s)
  ● test › test

    : Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.Error:

      4 | describe('test', () => {
      5 |   //toEqual('RestError: AKV10000: Request is missing a Bearer or PoP token.');
    > 6 |      it('test', async (done) => {
        |      ^
      7 |         await expect(getAPISecretKey('testKey')).rejects.toThrow('AKV10000: Request is missing a Bearer or PoP token.');
      8 |       

      at new Spec (node_modules/jest-jasmine2/build/jasmine/Spec.js:116:22)
      at Suite.<anonymous> (src/utils.test.js:6:6)
      at Object.<anonymous> (src/utils.test.js:4:1)

我能够通过从异步方法参数中删除“完成”来解决问题,如下所示。

jest.unmock('./utils.js');
//jest.setTimeout(10000);
describe('test', () => {
     it('test', async () => {
        await expect(getAPISecretKey('testKey')).rejects.toThrow('AKV10000: Request is missing a Bearer or PoP token.');
      
     });
 });