sinonjs / fake-timers

Fake setTimeout and friends (collectively known as "timers"). Useful in your JavaScript tests. Extracted from Sinon.JS
BSD 3-Clause "New" or "Revised" License
797 stars 104 forks source link

Support util.promisify on installed functions #347

Closed kevinoid closed 3 years ago

kevinoid commented 3 years ago

What did you expect to happen?

util.promisify would work on setTimeout installed by FakeTimers as it does on the global setTimeout.

What actually happens

The Promise returned by the installed setTimeout is never resolved because the installed setTimeout does not have a promisify.custom symbol property.

How to reproduce

const { promisify } = require('util');
const FakeTimers = require("@sinonjs/fake-timers");

console.log('initial global.setTimeout', setTimeout[promisify.custom]);

const target = { Date };
FakeTimers.install({ target });
console.log('installed target.setTimeout', target.setTimeout[promisify.custom]);

FakeTimers.install();
console.log('installed global.setTimeout', setTimeout[promisify.custom]);

prints

initial global.setTimeout [Function]
installed target.setTimeout undefined
installed global.setTimeout undefined

Discussion

This issue was noted by @joshua-barnett in https://github.com/sinonjs/fake-timers/pull/292#issuecomment-744443087. I'm opening this issue to track it.