diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ec72c721e1a..d8bf74829b8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ - `[jest-types]` [**BREAKING**] Use less `null | undefined` in config types ([#9200](https://github.com/facebook/jest/pull/9200)) - `[jest-utils]` Allow querying process.domain ([#9136](https://github.com/facebook/jest/pull/9136)) - `[pretty-format]` Correctly detect memoized elements ([#9196](https://github.com/facebook/jest/pull/9196)) +- `[jest-fake-timers]` Support `util.promisify` on `setTimeout` ([#9180](https://github.com/facebook/jest/pull/9180)) ### Chore & Maintenance diff --git a/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts b/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts index 434315c93343..1d99adff02ed 100644 --- a/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts +++ b/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts @@ -8,6 +8,7 @@ import {runInNewContext} from 'vm'; import mock = require('jest-mock'); import FakeTimers from '../jestFakeTimers'; +import util = require('util'); const timerConfig = { idToRef: (id: number) => id, @@ -40,6 +41,20 @@ describe('FakeTimers', () => { expect(global.setTimeout).not.toBe(undefined); }); + it('accepts to promisify setTimeout mock', async () => { + const global = ({process} as unknown) as NodeJS.Global; + const timers = new FakeTimers({ + config, + global, + moduleMocker, + timerConfig, + }); + timers.useFakeTimers(); + const timeoutPromise = util.promisify(global.setTimeout)(0, 'resolved'); + timers.runAllTimers(); + await expect(timeoutPromise).resolves.toBe('resolved'); + }); + it('installs clearTimeout mock', () => { const global = ({process} as unknown) as NodeJS.Global; const timers = new FakeTimers({ diff --git a/packages/jest-fake-timers/src/jestFakeTimers.ts b/packages/jest-fake-timers/src/jestFakeTimers.ts index 804320848897..7d46df24c42f 100644 --- a/packages/jest-fake-timers/src/jestFakeTimers.ts +++ b/packages/jest-fake-timers/src/jestFakeTimers.ts @@ -8,6 +8,7 @@ import {ModuleMocker} from 'jest-mock'; import {StackTraceConfig, formatStackTrace} from 'jest-message-util'; import {setGlobal} from 'jest-util'; +import util = require('util'); type Callback = (...args: Array) => void; @@ -368,6 +369,13 @@ export default class FakeTimers { // @ts-ignore TODO: figure out better typings here this._moduleMocker.fn().mockImplementation(impl); + const promisifiableFakeSetTimeout = fn(this._fakeSetTimeout.bind(this)); + promisifiableFakeSetTimeout[util.promisify.custom] = ( + delay?: number, + arg?: any, + ) => + new Promise(resolve => promisifiableFakeSetTimeout(resolve, delay, arg)); + // TODO: add better typings; these are mocks, but typed as regular timers this._fakeTimerAPIs = { clearImmediate: fn(this._fakeClearImmediate.bind(this)), @@ -376,7 +384,7 @@ export default class FakeTimers { nextTick: fn(this._fakeNextTick.bind(this)), setImmediate: fn(this._fakeSetImmediate.bind(this)), setInterval: fn(this._fakeSetInterval.bind(this)), - setTimeout: fn(this._fakeSetTimeout.bind(this)), + setTimeout: promisifiableFakeSetTimeout, }; }