Я использую Promise.prototype.finally () (или try-catch-finally в функции async
) в своем производственном коде для выполнения некоторого последующего кода без изменения статуса разрешения / отклонения текущего обещания.
Однако в моих тестах Jest я хотел бы обнаружить, что Promise внутри блока 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);
};