Skip to content
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

docs(fakeTimers): Explain how to use fake timers in testing-library #528

Merged
merged 8 commits into from
Jul 28, 2020
49 changes: 49 additions & 0 deletions docs/using-fake-timers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
---
id: using-fake-timers
title: Using Fake Timers
sidebar_label: Using Fake Timers
---

Using real timers in your tests is problematic since they depend on real time
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like the wording here strongly advises the use of fake timers 100% of the time or as the default. I don't know about anyone else, but fake timers as complexity to test code and only sometimes provide any benefit and I therefore only use them when I really want to fake timers (like a debounce). Either way, I don't think this mentions the drawbacks fairly and I think we should do so. I don't think people should come away from reading this with the ideas that fake timers should be their default way for testing. Maybe we could add a section for when fake timers are worth the trouble?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah you're right, it's pretty misleading, I'll work on that.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry it took me some time, I rephrased it.
I think it's still not 100% explanatory though, wasn't really sure how I can expand it..

lapse.
When you depend on real time, your tests can be unpredictable, slow, flaky. This
will also prevent you from making any assumptions about timestamps within
your tests.

To solve these problems, most testing frameworks offer the option to use fake
timers in your tests so you won't need to rely on real times.
eps1lon marked this conversation as resolved.
Show resolved Hide resolved

When using fake timers in your tests, all of the code inside your test uses fake
timers.
The common pattern to setup fake timers is usually within the `beforeEach`, for
example:

```js
// Fake timers using Jest
beforeEach(() => {
jest.useFakeTimers()
})
```

When using fake timers, you need to remember to restore the timers after your
test runs.
The main reason to do that is to prevent 3rd party libraries running after your
test finishes (e.g cleanup functions), from being coupled to your fake timers
and use real timers instead.
For that you usually call `useRealTimers` in `afterEach`.
It's important to also call `runOnlyPendingTimers` before switching to real
timers.
This will ensure you flush all the pending timers before you switch to real
timers. If you don't progress the timers and just switch to real timers, the
scheduled tasks won't get executed and you'll get an unexpected behavior.
This is mostly important for 3rd parties that schedule tasks without you being
aware of it.
Here's an example of doing that using jest:

```js
// Running all pending timers and switching to real timers using Jest
afterEach(() => {
jest.runOnlyPendingTimers()
jest.useRealTimers()
})
```
2 changes: 1 addition & 1 deletion website/sidebars.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"docs": {
"Getting Started": ["intro", "guiding-principles"],
"Getting Started": ["intro", "guiding-principles", "using-fake-timers"],
"Frameworks": [
{
"type": "subcategory",
Expand Down