Как смоделировать метод или функцию для возврата ожидаемой ошибки - PullRequest
0 голосов
/ 09 февраля 2019

Попытка научиться писать лучшие тесты с помощью Jest / Typescript.Я хотел бы убедиться, что могу проверить на наличие ошибки.

Я могу создать фиктивный метод, который будет возвращать ожидаемый массив данных, однако проверка на наличие ошибок оказывается трудной.

//program.ts
const listStacks = async (cf: CloudFormation): Promise<StackSummaries> => {
  try {
        const result = await cf.listStacks().promise();
        if (result.StackSummaries) {
          return result.StackSummaries;
        }
        return [];
  } catch(e) {
        console.log(e);
        throw e;  
  }

Вот мой тест ниже, обратите внимание, что я попытался вернуть новую ошибку вместо броска, но она тоже не работает.

//program.test.js
it('handles errors gracefully', async () => { 
    expect.assertions(1);
    const cfMock = {
        listStacks: (): any => ({
            promise: async () => {
                    throw new Error('ohh NOO!');             
            }
        })
    }
    expect(() => listStacks(cfMock as CloudFormation)).toThrow();

Jest возвращает это:

expect(received).toThrow()

Received function did not throw . 

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

listStacks - это функция async.

async функции возвращают следующее :

A Promise, которое будет разрешеносо значением, возвращаемым асинхронной функцией или отклоненным с неперехваченным исключением, выданным из асинхронной функции.

В этом случае вы предоставляете макет, который вызывает выбрасывание непогашенного исключения внутри *Функция 1015 *, поэтому вернет Promise, который будет отклонен с необработанным исключением .

Чтобы проверить это поведение, измените строку expect на следующую:

await expect(listStacks(cfMock)).rejects.toThrow();  // SUCCESS

Обратите внимание, что toThrow был исправлен для обещаний с PR 4884 , поэтому, если вы используете более старую версию Jest (до 22.0.0), вам нужно будет что-то использоватькак toEqual:

await expect(listStacks(cfMock)).rejects.toEqual(expect.any(Error));  // SUCCESS
0 голосов
/ 09 февраля 2019

Попробуйте поместить оператор throw в операцию, выполненную в блоке try.например:

  if(!result.StackSummaries) {
    throw new Error('error message to assert') 
  }

Блок catch будет перехватывать любую ошибку, выданную в блоке try, так что вы можете смоделировать возвращение listStacks, чтобы оно было нулевым, так что оно падает на это, если и выбрасываетошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...