Необходимо использовать функцию ожидаемости (), если вы ожидаете каких-либо вызовов асинхронных функций? - PullRequest
0 голосов
/ 12 июня 2018

Я обнаружил много подобных вещей при рефакторинге наших наборов тестов Jest:

it('calls the API and throws an error', async () => {
  expect.assertions(2);
  try {
    await login('email', 'password');
  } catch (error) {
    expect(error.name).toEqual('Unauthorized');
    expect(error.status).toEqual(401);
  }
});

Я считаю, что строка expect.assertions(2) здесь избыточна и может быть безопасно удалена, потому что мы ужеawait асинхронный вызов login().

Я прав, или я неправильно понял, как работает expect.assertions?

Ответы [ 3 ]

0 голосов
/ 13 августа 2018

expect.assertions важен при тестировании сценариев ошибок асинхронного кода и не является избыточным.

Если вы удалите expect.assertions из своего примера, вы не можете быть уверены, что login действительно сделалкинь ошибку.

it('calls the API and throws an error', async () => {
  try {
    await login('email', 'password');
  } catch (error) {
    expect(error.name).toEqual('Unauthorized');
    expect(error.status).toEqual(401);
  }
});

Допустим, кто-то изменил поведение login, чтобы выдать ошибку, основываясь на какой-то другой логике, или кто-то повлиял на макет этого теста, который больше не вызывает выброс login. Утверждения в блоке catch не будут выполняться, но тест будет по-прежнему проходить.

Использование expect.assertions в начале теста гарантирует, что если утверждения внутри перехвата заданыне работает, мы получаем сбой.

0 голосов
/ 23 июня 2019

Чтобы убедиться, что утверждения в блоке catch асинхронного / ожидающего теста должным образом протестированы, необходимо объявить expect.assertions(n), как показано в вашем фрагменте кода.Такое объявление не нужно для асинхронных / ожидающих тестов без блока catch.

Это кажется довольно не интуитивным, но это просто так, как есть.Возможно, по определенным причинам, находящимся глубоко в среде исполнения javascript, тестовая среда может определять, когда ожидаемое «обещание» успешно разрешено, но не может обнаружить то же самое для ожидаемых «обещаний», которые не удалось разрешить.Создатели тестовой среды, вероятно, дословно будут знать, почему это так.

0 голосов
/ 13 июня 2018

Это из документации Jest:

Expect.assertions (число) проверяет, что определенное количество утверждений вызывается во время теста.Это часто полезно при тестировании асинхронного кода, чтобы удостовериться, что утверждения в обратном вызове действительно были вызваны.

То есть, другими словами, Ожидайте .assertions гарантирует, что nКоличество утверждений составляется к концу теста.

Хорошо использовать его, особенно при написании новых тестов, поэтому можно легко проверить, что во время теста сделаны правильные утверждения.Асинхронные тесты часто проходят, потому что предполагаемые утверждения не были сделаны до того, как организатор теста (Джест, Мокко и т. Д.) Подумал, что тест завершен.

Если вы уверены, что ваш тест работает, как предполагалось, они могут наиболееконечно, будут удалены.

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