react/scripts/jest/matchers/reactTestMatchers.js
Andrew Clark ccb2a8a44e
Replace test renderer's fake Scheduler implementation with mock build (#14970)
* Replace test renderer's fake Scheduler implementation with mock build

The test renderer has its own mock implementation of the Scheduler
interface, with the ability to partially render work in tests. Now that
this functionality has been lifted into a proper mock Scheduler build,
we can use that instead.

* Fix Profiler tests in prod
2019-02-28 10:50:38 -08:00

83 lines
2.3 KiB
JavaScript

'use strict';
const JestReact = require('jest-react');
const SchedulerMatchers = require('./schedulerTestMatchers');
function captureAssertion(fn) {
// Trick to use a Jest matcher inside another Jest matcher. `fn` contains an
// assertion; if it throws, we capture the error and return it, so the stack
// trace presented to the user points to the original assertion in the
// test file.
try {
fn();
} catch (error) {
return {
pass: false,
message: () => error.message,
};
}
return {pass: true};
}
function resolveScheduler(obj) {
if (obj._Scheduler !== undefined) {
return obj._Scheduler;
}
return obj;
}
function assertYieldsWereCleared(Scheduler) {
const actualYields = Scheduler.unstable_clearYields();
if (actualYields.length !== 0) {
throw new Error(
'Log of yielded values is not empty. ' +
'Call expect(Scheduler).toHaveYielded(...) first.'
);
}
}
function toFlushAndYield(ReactNoop, expectedYields) {
const Scheduler = resolveScheduler(ReactNoop);
return SchedulerMatchers.toFlushAndYield(Scheduler, expectedYields);
}
function toFlushAndYieldThrough(ReactNoop, expectedYields) {
const Scheduler = resolveScheduler(ReactNoop);
return SchedulerMatchers.toFlushAndYieldThrough(Scheduler, expectedYields);
}
function toFlushWithoutYielding(ReactNoop) {
const Scheduler = resolveScheduler(ReactNoop);
return SchedulerMatchers.toFlushWithoutYielding(Scheduler);
}
function toHaveYielded(ReactNoop, expectedYields) {
const Scheduler = resolveScheduler(ReactNoop);
return SchedulerMatchers.toHaveYielded(Scheduler, expectedYields);
}
function toFlushAndThrow(ReactNoop, ...rest) {
const Scheduler = resolveScheduler(ReactNoop);
return SchedulerMatchers.toFlushAndThrow(Scheduler, ...rest);
}
function toMatchRenderedOutput(ReactNoop, expectedJSX) {
if (typeof ReactNoop.getChildrenAsJSX === 'function') {
const Scheduler = ReactNoop._Scheduler;
assertYieldsWereCleared(Scheduler);
return captureAssertion(() => {
expect(ReactNoop.getChildrenAsJSX()).toEqual(expectedJSX);
});
}
return JestReact.unstable_toMatchRenderedOutput(ReactNoop, expectedJSX);
}
module.exports = {
toFlushAndYield,
toFlushAndYieldThrough,
toFlushWithoutYielding,
toHaveYielded,
toFlushAndThrow,
toMatchRenderedOutput,
};