муравей, чтобы протестировать следующий модуль index.ts
async function theFunctionFail() {
return await fail();
}
async function theFunctionSucceed() {
return await succeed();
}
async function fail() {
throw new Error();
}
async function succeed() {
return "a";
}
export { theFunctionFail, theFunctionSucceed };
с помощью теста index.test.ts
import { theFunctionFail, theFunctionSucceed } from "../index";
it('theFunctionFail', () => {
expect(theFunctionFail()).rejects;
});
Что означает UnhandledPromiseRejectionWarning в выводе
(node:10515) UnhandledPromiseRejectionWarning: Error
(node:10515) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:10515) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
PASS src/__tests__/index.test.ts
✓ theFunctionFail (6ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.806s
Ran all test suites.
Ссылаться на? Обтекание expect(theFunctionFail()).rejects блоком try-catch(err) не избавляет от предупреждения, которое я считаю заслуживающим исправления.
Почему тест не проходит?/Как сделать так, чтобы тесты провалились? Если мой тест обнаружил серьезный недостаток, он не должен преуспеть в моем понимании.
Я использую Typescript и Jest 24.7.1 с react-scripts.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это предупреждение относится к тому факту, что в тесте происходит ошибка, которая не обрабатывается. Настоящая проблема в том, что ваш тест ничего не проверяет — есть expect без сопоставителя. Вот что должно быть:
return expect(theFunctionFail()).rejects.toEqual(new Error());
См. документы Jest для .rejects: https://jestjs.io/docs/en/tutorial-async#rejects
Примечание. Также можно использовать try/catch, но вы должны либо await следующим образом:
it('theFunctionFail', async () => {
expect.assertions(1);
try {
await theFunctionFail();
} catch (err) {
expect(err).toEqual(new Error());
}
});
Или верните асинхронную функцию и поймайте ошибку (убедитесь, что вы возвращаете функцию):
it('theFunctionFail', () => {
expect.assertions(1);
return theFunctionFail().catch(err => {
expect(err).toEqual(new Error());
});
});
expect.assertions(number) — это хороший способ убедиться, что все ваши expect вызываются при тестировании асинхронного поведения.
Кроме того, если вы добавите сообщение об ошибке, например. new Error('oh no!'), вы будете точно знать, что ловите правильную ошибку, и вам будет немного легче ее отлаживать.
Похоже, ваша проблема может быть в вашем коде, а не в ваших тестах. Я хотел бы убедиться, что в вашем коде нет промисов без .catch или каких-либо await за пределами try/catch
Верно. Я просто не знаю, как найти это в коде, не кропотливо прогоняя каждый тест по отдельности.
привет, интересно, если вы нашли способ определить оскорбительный тест? или воспроизвести это в вашей местной шутке? Наша шутка завершается только в нашем конвейере CI, в локальном вроде все нормально
Самым чистым решением, которое не выдает UnhandledPromiseRejectionWarning в консоли, является использование функции jest ожидать.toThrow().
import { theFunctionFail, theFunctionSucceed } from "../index";
it('theFunctionFail', () => {
expect(theFunctionFail()).rejects.toThrow();
});
И снова можно попробовать сопоставить конкретную ошибку. Например. если:
async function fail() {
throw new Error('Something failed');
}
затем вы должны протестировать с помощью:
it('theFunctionFail', () => {
expect(theFunctionFail()).rejects.toThrow(Error('Something failed'));
});
Есть ли способ более легко найти оскорбительный тест? Есть ли временный патч для обезьян, который я могу сделать? У меня более 1000 для этого одного проекта, и ошибка не совпадает с тем, где она отображается в выходных данных.