Skip to content

Commit

Permalink
Use modern timers in monorepo Jest tests (facebook#38955)
Browse files Browse the repository at this point in the history
Summary:
Pull Request resolved: facebook#38955

Jest introduced "modern" timers based on `sinon/fake-timers` in Jest 26 ([release announcement](https://jestjs.io/blog/2020/05/05/jest-26#new-fake-timers)), and they became the default in Jest 27, in May 2021.

Modern timers have more capabilities - they were introduced with support for `queueMicrotask`, mocking `Date`, etc., and they've continued to receive more attention from the Jest team since - they're now much more comprehensive and more configurable than legacy timers.

Importantly, because they're not based on Jest mocks, they're not affected in surprising ways by eg `jest.resetAllMocks()` (a particularly confusing side-effect when fake timers are enabled globally, as in our setup).

This migrates RN's own tests and config to modern fake timers, or real timers where that's more appropriate.

NOTE: In cases where non-trivial changes to the tests are required, four test files are individually opted-in to `legacyFakeTimers` with a `TODO(legacy-fake-timers)`. I'll open these up for community contributions to fix.

Changelog: [Internal]

Reviewed By: motiz88

Differential Revision: D48189907

fbshipit-source-id: 2e7ce74cc60e80679d81d7c16d599ad1bbe2c921
  • Loading branch information
robhogan authored and facebook-github-bot committed Aug 11, 2023
1 parent dea9c35 commit 86968c1
Show file tree
Hide file tree
Showing 7 changed files with 14 additions and 10 deletions.
2 changes: 1 addition & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ module.exports = {
setupFiles: ['./packages/react-native/jest/local-setup.js'],
fakeTimers: {
enableGlobally: true,
legacyFakeTimers: true,
legacyFakeTimers: false,
},
snapshotFormat: {
escapeString: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@

'use strict';

// TODO(legacy-fake-timers): Fix these tests to work with modern timers.
jest.useFakeTimers({legacyFakeTimers: true});

jest.mock('react-native/Libraries/Utilities/HMRClient');

jest.mock('react-native/Libraries/Core/Devtools/getDevServer', () =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,15 +166,10 @@ describe('promise tasks', () => {
}
beforeEach(() => {
jest.resetModules();
jest.useFakeTimers({legacyFakeTimers: true});
InteractionManager = require('../InteractionManager');
sequenceId = 0;
});

afterEach(() => {
jest.useRealTimers();
});

it('should run a basic promise task', () => {
const task1 = jest.fn(() => {
expect(++sequenceId).toBe(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
*/

'use strict';

// TODO(legacy-fake-timers): Fix these tests to work with modern timers.
jest.useFakeTimers({legacyFakeTimers: true});

jest.mock('../../../Core/Devtools/parseErrorStack', () => {
return {__esModule: true, default: jest.fn(() => [])};
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
* @oncall react_native
*/

// TODO(legacy-fake-timers): Fix these tests to work with modern timers.
jest.useFakeTimers({legacyFakeTimers: true});

import type {PressEvent} from '../../Types/CoreEventTypes';

const UIManager = require('../../ReactNative/UIManager');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
* @oncall react_native
*/

// TODO(legacy-fake-timers): Fix these tests to work with modern timers.
jest.useFakeTimers({legacyFakeTimers: true});

import type {HostComponent} from '../../../Renderer/shims/ReactNativeTypes';

import * as React from 'react';
Expand Down
4 changes: 0 additions & 4 deletions scripts/__tests__/publish-npm-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,8 @@ let consoleError;

describe('publish-npm', () => {
beforeAll(() => {
jest.useFakeTimers({legacyFakeTimers: false});
jest.setSystemTime(date);
});
afterAll(() => {
jest.useRealTimers();
});
beforeEach(() => {
consoleError = console.error;
console.error = consoleErrorMock;
Expand Down

0 comments on commit 86968c1

Please sign in to comment.