diff --git a/packages/material-ui-lab/src/SpeedDialAction/SpeedDialAction.test.js b/packages/material-ui-lab/src/SpeedDialAction/SpeedDialAction.test.js
index 8a0a5f04a286c7..b42d1bee015f3e 100644
--- a/packages/material-ui-lab/src/SpeedDialAction/SpeedDialAction.test.js
+++ b/packages/material-ui-lab/src/SpeedDialAction/SpeedDialAction.test.js
@@ -11,25 +11,25 @@ import SpeedDialAction from './SpeedDialAction';
import describeConformance from '@material-ui/core/test-utils/describeConformance';
describe('', () => {
+ let clock;
+ beforeEach(() => {
+ clock = useFakeTimers();
+ });
+
+ afterEach(() => {
+ clock.restore();
+ });
+
// StrictModeViolation: uses Tooltip
const mount = createMount({ strict: false });
const render = createClientRender({ strict: false });
let classes;
const fabClasses = getClasses(Fab);
- let clock;
before(() => {
classes = getClasses(add} tooltipTitle="placeholder" />);
});
- beforeEach(() => {
- clock = useFakeTimers();
- });
-
- afterEach(() => {
- clock.restore();
- });
-
describeConformance(
add} tooltipTitle="placeholder" />,
() => ({
diff --git a/packages/material-ui/src/ButtonBase/TouchRipple.test.js b/packages/material-ui/src/ButtonBase/TouchRipple.test.js
index 586a1124275138..18c31d2c8e6d9b 100644
--- a/packages/material-ui/src/ButtonBase/TouchRipple.test.js
+++ b/packages/material-ui/src/ButtonBase/TouchRipple.test.js
@@ -157,11 +157,11 @@ describe('', () => {
*/
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
diff --git a/packages/material-ui/src/Collapse/Collapse.test.js b/packages/material-ui/src/Collapse/Collapse.test.js
index 0fc826bb83dd62..e953374fd58749 100644
--- a/packages/material-ui/src/Collapse/Collapse.test.js
+++ b/packages/material-ui/src/Collapse/Collapse.test.js
@@ -143,11 +143,11 @@ describe('', () => {
describe('prop: timeout', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
diff --git a/packages/material-ui/src/Dialog/Dialog.test.js b/packages/material-ui/src/Dialog/Dialog.test.js
index 6cad38e233fe54..6ebcbe85b3389e 100644
--- a/packages/material-ui/src/Dialog/Dialog.test.js
+++ b/packages/material-ui/src/Dialog/Dialog.test.js
@@ -34,6 +34,14 @@ function clickBackdrop(container) {
describe('', () => {
let clock;
+ beforeEach(() => {
+ clock = useFakeTimers();
+ });
+
+ afterEach(() => {
+ clock.restore();
+ });
+
// StrictModeViolation: uses Fade
const mount = createMount({ strict: false });
let classes;
@@ -43,14 +51,6 @@ describe('', () => {
classes = getClasses();
});
- beforeEach(() => {
- clock = useFakeTimers();
- });
-
- afterEach(() => {
- clock.restore();
- });
-
describeConformance(, () => ({
classes,
inheritComponent: Modal,
diff --git a/packages/material-ui/src/Popper/Popper.test.js b/packages/material-ui/src/Popper/Popper.test.js
index 4e12bf128f2723..b818aa36b085d7 100644
--- a/packages/material-ui/src/Popper/Popper.test.js
+++ b/packages/material-ui/src/Popper/Popper.test.js
@@ -201,17 +201,17 @@ describe('', () => {
describe('prop: transition', () => {
let clock;
- const looseRender = createClientRender({ strict: false });
-
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
// StrictModeViolation: uses Grow
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
+ const looseRender = createClientRender({ strict: false });
+
it('should work', () => {
const { queryByRole, getByRole, setProps } = looseRender(
diff --git a/packages/material-ui/src/Select/Select.test.js b/packages/material-ui/src/Select/Select.test.js
index cd36a6618b13ec..669dd7da941b7b 100644
--- a/packages/material-ui/src/Select/Select.test.js
+++ b/packages/material-ui/src/Select/Select.test.js
@@ -617,11 +617,11 @@ describe('', () => {
describe('prop: open (controlled)', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
diff --git a/packages/material-ui/src/Snackbar/Snackbar.test.js b/packages/material-ui/src/Snackbar/Snackbar.test.js
index a89c64358f510b..a6763be678c54c 100644
--- a/packages/material-ui/src/Snackbar/Snackbar.test.js
+++ b/packages/material-ui/src/Snackbar/Snackbar.test.js
@@ -45,11 +45,11 @@ describe('', () => {
describe('Consecutive messages', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
@@ -100,11 +100,11 @@ describe('', () => {
describe('prop: autoHideDuration', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
@@ -242,11 +242,11 @@ describe('', () => {
describe('prop: resumeHideDuration', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
@@ -324,11 +324,11 @@ describe('', () => {
describe('prop: disableWindowBlurListener', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
diff --git a/packages/material-ui/src/Tab/Tab.test.js b/packages/material-ui/src/Tab/Tab.test.js
index 8e410612674c94..afb365bc0e0145 100644
--- a/packages/material-ui/src/Tab/Tab.test.js
+++ b/packages/material-ui/src/Tab/Tab.test.js
@@ -8,10 +8,9 @@ import { act, createClientRender, fireEvent } from 'test/utils/createClientRende
import Tab from './Tab';
import ButtonBase from '../ButtonBase';
-const render = createClientRender();
-
describe('', () => {
const mount = createMount();
+ const render = createClientRender();
let classes;
before(() => {
diff --git a/packages/material-ui/src/Tabs/ScrollbarSize.test.js b/packages/material-ui/src/Tabs/ScrollbarSize.test.js
index 8fd4f987655afc..232b1e4d580b83 100644
--- a/packages/material-ui/src/Tabs/ScrollbarSize.test.js
+++ b/packages/material-ui/src/Tabs/ScrollbarSize.test.js
@@ -5,17 +5,18 @@ import ScrollbarSize from './ScrollbarSize';
import { createClientRender } from 'test/utils/createClientRender';
describe('', () => {
- const render = createClientRender();
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
+ const render = createClientRender();
+
describe('mount', () => {
it('should call on initial load', () => {
const onChange = spy();
diff --git a/packages/material-ui/src/Tabs/Tabs.test.js b/packages/material-ui/src/Tabs/Tabs.test.js
index d5cd9ab156854f..733b29a972b575 100644
--- a/packages/material-ui/src/Tabs/Tabs.test.js
+++ b/packages/material-ui/src/Tabs/Tabs.test.js
@@ -332,11 +332,11 @@ describe('', () => {
);
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
@@ -409,11 +409,11 @@ describe('', () => {
describe('prop: scrollButtons', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
@@ -543,11 +543,11 @@ describe('', () => {
describe('scroll button behavior', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
@@ -584,11 +584,11 @@ describe('', () => {
describe('scroll into view behavior', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
diff --git a/packages/material-ui/src/TextareaAutosize/TextareaAutosize.test.js b/packages/material-ui/src/TextareaAutosize/TextareaAutosize.test.js
index ef6533f4ba9571..e220167767a6d2 100644
--- a/packages/material-ui/src/TextareaAutosize/TextareaAutosize.test.js
+++ b/packages/material-ui/src/TextareaAutosize/TextareaAutosize.test.js
@@ -52,11 +52,11 @@ describe('', () => {
describe('resize', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
diff --git a/packages/material-ui/src/Tooltip/Tooltip.test.js b/packages/material-ui/src/Tooltip/Tooltip.test.js
index 396c4eb239c546..a7903ef736eeb8 100644
--- a/packages/material-ui/src/Tooltip/Tooltip.test.js
+++ b/packages/material-ui/src/Tooltip/Tooltip.test.js
@@ -24,11 +24,21 @@ function simulatePointerDevice() {
}
describe('', () => {
+ let clock;
+ beforeEach(() => {
+ testReset();
+ clock = useFakeTimers();
+ });
+
+ afterEach(() => {
+ clock.tick(800); // cleanup the hystersis timer
+ clock.restore();
+ });
+
// StrictModeViolation: uses Grow and tests a lot of impl details
const mount = createMount({ strict: null });
let classes;
const render = createClientRender({ strict: false });
- let clock;
before(() => {
classes = getClasses(
@@ -38,16 +48,6 @@ describe('', () => {
);
});
- beforeEach(() => {
- testReset();
- clock = useFakeTimers();
- });
-
- afterEach(() => {
- clock.tick(800); // cleanup the hystersis timer
- clock.restore();
- });
-
describeConformance(
diff --git a/packages/material-ui/src/Zoom/Zoom.test.js b/packages/material-ui/src/Zoom/Zoom.test.js
index ac73accdf31075..edb4e95f8ee2b0 100644
--- a/packages/material-ui/src/Zoom/Zoom.test.js
+++ b/packages/material-ui/src/Zoom/Zoom.test.js
@@ -34,11 +34,11 @@ describe('', () => {
describe('transition lifecycle', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
diff --git a/packages/material-ui/src/utils/debounce.test.js b/packages/material-ui/src/utils/debounce.test.js
index ed77e0469193fd..7063530bf39189 100644
--- a/packages/material-ui/src/utils/debounce.test.js
+++ b/packages/material-ui/src/utils/debounce.test.js
@@ -5,11 +5,11 @@ import debounce from './debounce';
describe('debounce', () => {
let clock;
- before(() => {
+ beforeEach(() => {
clock = useFakeTimers();
});
- after(() => {
+ afterEach(() => {
clock.restore();
});
diff --git a/packages/material-ui/test/integration/Menu.test.js b/packages/material-ui/test/integration/Menu.test.js
index 5a173795da1f60..b3a373441baf7a 100644
--- a/packages/material-ui/test/integration/Menu.test.js
+++ b/packages/material-ui/test/integration/Menu.test.js
@@ -73,9 +73,6 @@ describe(' integration', () => {
* @type {ReturnType}
*/
let clock;
- // StrictModeViolation: uses Popover
- const render = createClientRender({ strict: false });
-
beforeEach(() => {
clock = useFakeTimers();
});
@@ -84,6 +81,9 @@ describe(' integration', () => {
clock.restore();
});
+ // StrictModeViolation: uses Popover
+ const render = createClientRender({ strict: false });
+
it('is part of the DOM by default but hidden', () => {
const { getByRole } = render();
diff --git a/test/utils/createClientRender.js b/test/utils/createClientRender.js
index 37fae1b2df4675..2b6184ff980e91 100644
--- a/test/utils/createClientRender.js
+++ b/test/utils/createClientRender.js
@@ -97,7 +97,20 @@ function clientRender(element, options = {}) {
export function createClientRender(globalOptions = {}) {
const { strict: globalStrict } = globalOptions;
+ // save stack to re-use in async afterEach
+ const { stack: createClientRenderStack } = new Error();
afterEach(async () => {
+ if (setTimeout.hasOwnProperty('clock')) {
+ const error = Error(
+ "Can't cleanup before fake timers are restored.\n" +
+ 'Be sure to:\n' +
+ ' 1. Restore the clock in `afterEach` instead of `after`.\n' +
+ ' 2. Move the test hook to restore the clock before the call to `createClientRender()`.',
+ );
+ // Use saved stack otherwise the stack trace will not include the test location.
+ error.stack = createClientRenderStack;
+ throw error;
+ }
// If this issues an act() warning you probably didn't
// wait for an async event in your test (or didn't wrap it in act() at all).
// please wait for every update in your test and make appropriate assertions