Skip to content

Commit

Permalink
fix(cleanup): microtask flushing now supports fake timers (#720)
Browse files Browse the repository at this point in the history
  • Loading branch information
kentcdodds authored Jun 24, 2020
1 parent 96c79f8 commit 5814b29
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions src/flush-microtasks.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,18 @@
// and the part that is not cannot easily have useful tests written
// anyway. So we're just going to ignore coverage for this file
/**
* copied from React's enqueueTask.js
* copied and modified from React's enqueueTask.js
*/

function getIsUsingFakeTimers() {
return (
typeof jest !== 'undefined' &&
typeof setTimeout !== 'undefined' &&
(setTimeout.hasOwnProperty('_isMockFunction') ||
setTimeout.hasOwnProperty('clock'))
)
}

let didWarnAboutMessageChannel = false
let enqueueTask
try {
Expand Down Expand Up @@ -43,7 +52,15 @@ try {
export default function flushMicroTasks() {
return {
then(resolve) {
enqueueTask(resolve)
if (getIsUsingFakeTimers()) {
// without this, a test using fake timers would never get microtasks
// actually flushed. I spent several days on this... Really hard to
// reproduce the problem, so there's no test for it. But it works!
jest.advanceTimersByTime(0)
resolve()
} else {
enqueueTask(resolve)
}
},
}
}

0 comments on commit 5814b29

Please sign in to comment.