-
Notifications
You must be signed in to change notification settings - Fork 108
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Feature]: In Node, hijack perf_hooks.performance in addition to global.performance #462
Comments
This is starting to get a bit exotic ... Think you could get away with simply faking the required exports yourself? |
Yes, as a workaround I did that (in Jest) and it works: jest.mock('perf_hooks', () => ({
performance: {
now: () => global.performance.now(),
},
})); But as a user, it was very confusing until I dug deep to the fake-timers source code. The documentation talks about overriding Maybe the documentation could have a disclaimer about |
I think it's probably fine to support it and not a lot of work? I'm happy to make changes in Node if that'd help |
@benjamingr I am at a bit of a loss as to how to do this cleanly without hooking into module loader territory, so if you have a way of doing this cleanly by exposing something in Node, then by all means feel free ❤️ |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. |
@benjamingr Know if something for us to hook into will arrive? |
+1, this will definitely help users of |
@dmurvihill If you know how we can do this in some reasonable manner, then feel free to supply a PR. I do not know how. To the best of my knowledge, this would venture into module loader territory, like what I am doing in this article. On the other hand, |
I ended up moving away from the affected dependency entirely, but if it comes up again I'll come back for another look. |
Never got a reply from Node folks on a related question, so this is requiring a deeper look from someone interested. |
Kevin's general approach works fine - ESM or no ESM (if you exclude Jest specifics): while the exports are not assignable, their fields are. So we can easily use the same approach in fake-timers: const perf_hooks = await import("perf_hooks")
perf_hooks.performance.now = () => 42 Should not be much work. I just (erroneously) assumed we needed to replace the entire module. |
What did you expect to happen? After calling
useFakeTimers()
,perf_hooks.performance.now()
should return a fake time, just like howperformance.now()
does.What actually happens 1.
perf_hooks.performance.now()
is not the same asperformance.now()
. The latter is correctly hijacked and returns a fake time. 2.perf_hooks.performance.now()
returns a negative value -- undefined behavior?How to reproduce
https://github.com/kevinyou/wtf-performance-now-mocking/tree/main/sinon-fake-timers
The text was updated successfully, but these errors were encountered: