Я использую Promise.prototype.finally () (или try-catch-finally в функции async
) в моем производственном коде, чтобы выполнить некоторый дополнительный код без изменения статуса разрешения / отклонения текущего обещания.
Однако в своих тестах Jest я хотел бы обнаружить, что промис внутри блока finally не был отклонен.
edit: Но я не хочу на самом деле ждать Promise в моем производственном коде (там меня волнуют только ошибки, повторно генерируемые из catch, но не ошибки из finally).
Как я могу это проверить? Или, по крайней мере, как издеваться над Promise.prototype, чтобы отклонить текущее обещание об исключениях из finally?
Например. если бы я тестировал redux
создателей действий, тесты проходят, даже если есть сообщение о необработанном отклонении обещания:
https://codesandbox.io/s/reverent-dijkstra-nbcno?file=/src/index.test.js
test("finally", async () => {
const actions = await dispatchMock(add("forgottenParent", { a: 1 }));
const newState = actions.reduce(reducer, undefined);
expect(newState).toEqual({});
});
const dispatchMock = async thunk => {...};
// ----- simplified "production" code -----
const reducer = (state = {}, action) => state;
const add = parentId => async dispatch => {
dispatch("add start");
try {
await someFetch("someData");
dispatch("add success");
} catch (e) {
dispatch("add failed");
throw e;
} finally {
dispatch(get(parentId)); // tests pass if the promise here is rejected
}
};
const get = id => async dispatch => {
dispatch("get start");
try {
await someFetch(id);
dispatch("get success");
} catch (e) {
dispatch("get failed");
throw e;
}
};
const someFetch = async id => {
if (id === "forgottenParent") {
throw new Error("imagine I forgot to mock this request");
}
Promise.resolve(id);
};
get
или внутриdispatch
? - person Dai   schedule 06.08.2020finally
как в нормальном (синхронном), так и в _2 _ / _ 3_ (не при использовании цепочки методов Promise), исключение следует повторно выбросить на верхнем уровнеawait
, если оно не было проглочено где то посередине. Если вы видите, что исключения проглатываются незаметно, я предлагаю использовать параметр «Прервать все выброшенные исключения» (или параметр с аналогичным названием) в вашем отладчике JavaScript. По умолчанию большинство отладчиков JS прерывают работу только для _необработанных_ / неперехваченных исключений. Надеюсь, таким образом вы сможете увидеть, где его поймают и проглотят. - person Dai   schedule 06.08.2020throw e
снова бросил его внутрь блока catchget
. и нет, нет, он работает в соответствии со спецификацией, исключения изнутриfinally
игнорируются в том, что касается разрешенного статуса внешнего обещания = ›он проглатывается самимfinally
, и это правильное поведение (но я хочу изменить это поведение внутри моих тестов) - см. вкладку тестов и вложенную вкладку Проблемы при выполнении на связанных кодах и - person Aprillion   schedule 06.08.2020