Как обработать асинхронную ошибку Rest в модульных тестах с помощью jest

#javascript #node.js #unit-testing #jestjs

Вопрос:

Ниже приведен код моего тестового файла node 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.'));
     });
 });
 

код ключа getAPISecretKey

 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)
 

Комментарии:

1. Вам нужно показать код getAPISecretKey

2. @slideshowp2 , обновленный вопрос с запрошенным кодом

3. Может toThrow быть, вместо toEqual этого ? Исключение, скорее всего, является объектом, и вы проверяете строку. «Ожидаемые» и «Полученные» значения выглядят одинаково, потому что Error.toString просто выводит сообщение об ошибке.

4. @Cully, спасибо за ваш ответ, я тоже пытался это сделать, но получил сообщение об ошибке «Тайм — аут-Асинхронный обратный вызов не был вызван в течение тайм-аута 5000 мс, указанного jest.setTimeout. Тайм — аут-Асинхронный обратный вызов не был вызван в течение тайм-аута 5000 мс, указанного в jest.setTimeout. Ошибка:» я также обновил вопросы. пожалуйста, посмотрите

5. Тебе обязательно await getAPISecretKey это делать ? Это асинхронно. Похоже , вы просто передаете Обещание expect , а не результат getAPISecretKey . На самом деле, нм, похоже, что, возможно, вам это не нужно для .rejects

Ответ №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.');
      
     });
 });