Напишите тестовые примеры jest unit для обработки исключений, возникающих при запуске

Это мой класс контроллера:

        @Put()
            async updateUser(@BodyToClass() user: UpsertUserDto): Promise<UpsertUserDto> {
                try {
                    return await this.userService.updateUser(user);
                } catch (e) {
                    throw new HttpException(e.message, HttpStatus.INTERNAL_SERVER_ERROR);
                }
            }

Это мой тестовый класс Usercontroller.spec, я пишу тестовые примеры для обработки исключений для отрицательных случаев.

Во время работы получаю ошибку в этой строке:

        ".then(() => done.fail('Client controller should return INTERNAL_SERVER_ERROR 500 '))

Вот мое сообщение об ошибке от Jest:

в Env.fail (../node_modules/jest-jasmine2/build/jasmine/Env.js:722:61) в user/user.controller.spec.ts:51:33 в Object. (пользователь/user.controller.spec.ts:50:15)

Я не уверен, где я делаю ошибку или есть ли другой способ обработать исключение вnesjs.

       it('should throw INTERNAL_SERVER_ERROR if user not update', async (done) => {
          const expectedResult = undefined;
          const testuser =  new  UpsertUserDto();
          testuser.id = '123';
          jest.spyOn(userservice, 'updateUser').mockResolvedValue(expectedResult);
          await usercontroller.updateUser(testuser)
           .then(() => done.fail('Client controller should return INTERNAL_SERVER_ERROR 500 '))
           .catch((error) => {
             expect(error.status).toBe(500);
             expect(error.message).toMatchObject({error: ' INTERNAL_SERVER_ERROR', statusCode: 500});
             done();
            });

    });

person sandeep singh    schedule 19.05.2020    source источник
comment
курсор указывает на эту строку (выше), которую я добавил.   -  person sandeep singh    schedule 19.05.2020
comment
в Env.fail (../node_modules/jest-jasmine2/build/jasmine/Env.js:722:61) в user/user.controller.spec.ts:51:33 в Object.‹anonymous› (пользователь/пользователь .спецификация.контроллера.ts:50:15)   -  person sandeep singh    schedule 19.05.2020
comment
: Timeout — асинхронный обратный вызов не был вызван в течение времени ожидания 5000 мс, указанного jest.setTimeout.Timeout — асинхронный обратный вызов не был вызван в течение времени ожидания 5000 мс, указанного jest.setTimeout.Error: получение этого сообщения об ошибке   -  person sandeep singh    schedule 19.05.2020


Ответы (1)


Вы используете mockResolvedValue в своем jest.spyOn, что означает, что в цепочке .then .catch никогда не будет выполнено. Глядя на ваш код, все, что происходит, это то, что ваш метод UserService возвращает undefined, и, поскольку вокруг него нет логики, контроллер затем возвращает это undefined, что означает, что ошибка не может быть обнаружена. Если вы пытаетесь проверить ошибку, вместо этого следует использовать mockRejectedValue. Кроме того, обычно не рекомендуется смешивать использование async/await с использованием обратного вызова done, так как это может привести к некоторым странным ситуациям.

И, наконец, Jest имеет встроенный способ проверки функций на наличие ошибок. Вместо этого ваш тест может выглядеть примерно так:

it('should throw INTERNAL_SERVER_ERROR if user not update', async () => {
  const testuser =  new  UpsertUserDto();
  testuser.id = '123';
  jest.spyOn(userservice, 'updateUser').mockRejectedValue(new Error('There was an error'));
  await expect(usercontroller.updateUser(testuser)).rejects.toThrow(HttpException);
  await expect(usercontroller.updateUser(testuser)).rejects.toThrow('There was an error');
});

Я предлагаю вам потратить некоторое время на чтение документации Jest и, возможно, рассмотрев несколько примеров, чтобы начать тестирование.

person Jay McDoniel    schedule 19.05.2020
comment
Большое спасибо, Джей. Обязательно прочитаю документацию по шутке. - person sandeep singh; 19.05.2020
comment
щелкнув эту ссылку «просмотр некоторых примеров» .... кажется, что сайт недоступен - person sandeep singh; 19.05.2020
comment
Опечатка в ссылке. Исправлено сейчас - person Jay McDoniel; 19.05.2020