![](/img/trans.png)
[英]How do I fail a test in Jest when an uncaught promise rejection occurs?
[英]How do I test promise delays with jest?
這是我用來延遲過程的代碼(用於退避)
export function promiseDelay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
我想測試它,但我不能。 我嘗試使用 fakeTimers 但我的測試永遠不會結束。
test('promiseDelay delays for 1s', async (done) => {
jest.useFakeTimers();
Promise.resolve().then(() => jest.advanceTimersByTime(100));
await promiseDelay(100);
});
promiseDelay
返回一個Promise
是后消失ms
所以稱之為spy
在then
和測試,看是否spy
有不同的時間間隔后,被稱為:
describe('promiseDelay', () => {
beforeEach(() => { jest.useFakeTimers(); });
afterEach(() => { jest.useRealTimers(); });
test('should not resolve until timeout has elapsed', async () => {
const spy = jest.fn();
promiseDelay(100).then(spy); // <= resolve after 100ms
jest.advanceTimersByTime(20); // <= advance less than 100ms
await Promise.resolve(); // let any pending callbacks in PromiseJobs run
expect(spy).not.toHaveBeenCalled(); // SUCCESS
jest.advanceTimersByTime(80); // <= advance the rest of the time
await Promise.resolve(); // let any pending callbacks in PromiseJobs run
expect(spy).toHaveBeenCalled(); // SUCCESS
});
});
請注意,測試代碼是同步的, Timer Mocks使setTimeout
同步,但then
在PromiseJobs
回調排隊,因此在測試是否已調用spy
之前,需要允許任何排隊的回調運行。
這可以通過使用async
測試函數並在已解決的Promise
上調用await
來完成,該Promise
在PromiseJobs
結束時有效地將測試的其余部分排隊,允許任何掛起的回調在測試繼續之前運行。
有關如何承諾和假計時器相互作用可在我的答案的其他信息在這里。
我認為你只需要從函數中返回承諾
test('promiseDelay delays for 1s',() => {
jest.useFakeTimers();
return Promise.resolve().then(() => jest.advanceTimersByTime(100));
});
然后監視要調用一次的 setTimeout。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.