Match-id-89458c22ed2f2dfd010d67ad0d278bf567069cf2
This commit is contained in:
parent
9ca4b3851b
commit
9ca104278e
|
@ -127,7 +127,7 @@ module.exports = {
|
|||
// runner: "jest-runner",
|
||||
|
||||
// The paths to modules that run some code to configure or set up the testing environment before each test
|
||||
setupFiles: [require.resolve('./scripts/__tests__/jest/setupTests.js')],
|
||||
//setupFiles: [],
|
||||
|
||||
// A list of paths to modules that run some code to configure or set up the testing framework before each test
|
||||
setupFilesAfterEnv: [require.resolve('./scripts/__tests__/jest/setupEnvironment.js')],
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import * as React from '../../../libs/horizon/src/external/Horizon';
|
||||
import * as HorizonDOM from '../../../libs/horizon/src/dom/DOMExternal';
|
||||
//import { act } from 'react-dom/test-utils';
|
||||
import * as Scheduler from 'scheduler';
|
||||
import * as LogUtils from '../jest/logUtils';
|
||||
|
||||
describe('useState Hook Test', () => {
|
||||
const { useState, forwardRef, useImperativeHandle, memo } = React;
|
||||
|
@ -18,11 +17,11 @@ describe('useState Hook Test', () => {
|
|||
unmountComponentAtNode(container);
|
||||
container.remove();
|
||||
container = null;
|
||||
Scheduler.reset();
|
||||
LogUtils.reset();
|
||||
});
|
||||
|
||||
const Text = (props) => {
|
||||
Scheduler.unstable_yieldValue(props.text);
|
||||
LogUtils.injectValue(props.text);
|
||||
return <p>{props.text}</p>;
|
||||
}
|
||||
|
||||
|
@ -80,17 +79,17 @@ describe('useState Hook Test', () => {
|
|||
}
|
||||
HorizonDOM.render(<App />, container);
|
||||
expect(container.querySelector('p').innerHTML).toBe('0');
|
||||
expect(Scheduler).toHaveYielded([0]);
|
||||
expect(LogUtils).toMatchValue([0]);
|
||||
// useState修改state 时,设置相同的值,函数组件不会重新渲染
|
||||
setNum(0);
|
||||
expect(Scheduler).toHaveYielded([]);
|
||||
expect(LogUtils).toMatchValue([]);
|
||||
expect(container.querySelector('p').innerHTML).toBe('0');
|
||||
});
|
||||
|
||||
it('useState的惰性初始化', () => {
|
||||
const App = forwardRef((props, ref) => {
|
||||
const [num, setNum] = useState(() => {
|
||||
Scheduler.unstable_yieldValue(props.initNum);
|
||||
LogUtils.injectValue(props.initNum);
|
||||
return props.initNum
|
||||
});
|
||||
useImperativeHandle(ref, () => ({ setNum }))
|
||||
|
@ -99,12 +98,12 @@ describe('useState Hook Test', () => {
|
|||
})
|
||||
const ref = React.createRef(null);
|
||||
HorizonDOM.render(<App initNum={1} ref={ref} />, container);
|
||||
expect(Scheduler).toHaveYielded([1]);
|
||||
expect(LogUtils).toMatchValue([1]);
|
||||
expect(container.querySelector('p').innerHTML).toBe('1');
|
||||
// 设置num为3
|
||||
ref.current.setNum(3);
|
||||
// 初始化函数只在初始渲染时被调用,所以Scheduler里的dataArray清空后没有新增。
|
||||
expect(Scheduler).toHaveYielded([]);
|
||||
expect(LogUtils).toMatchValue([]);
|
||||
expect(container.querySelector('p').innerHTML).toBe('3');
|
||||
});
|
||||
|
||||
|
@ -116,15 +115,15 @@ describe('useState Hook Test', () => {
|
|||
return <Text text={num} />;
|
||||
})
|
||||
HorizonDOM.render(<App />, container);
|
||||
expect(Scheduler).toHaveYielded([0]);
|
||||
expect(LogUtils).toMatchValue([0]);
|
||||
expect(container.querySelector('p').innerHTML).toBe('0');
|
||||
// 不会重新渲染
|
||||
HorizonDOM.render(<App />, container);
|
||||
expect(Scheduler).toHaveYielded([]);
|
||||
expect(LogUtils).toMatchValue([]);
|
||||
expect(container.querySelector('p').innerHTML).toBe('0');
|
||||
// 会重新渲染
|
||||
setNum(1)
|
||||
expect(Scheduler).toHaveYielded([1]);
|
||||
expect(LogUtils).toMatchValue([1]);
|
||||
expect(container.querySelector('p').innerHTML).toBe('1');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
function captureAssertion(fn) {
|
||||
function runAssertion(fn) {
|
||||
try {
|
||||
fn();
|
||||
} catch (error) {
|
||||
|
@ -10,13 +10,13 @@ function captureAssertion(fn) {
|
|||
return {pass: true};
|
||||
}
|
||||
|
||||
function toHaveYielded(Scheduler, expectedYields) {
|
||||
return captureAssertion(() => {
|
||||
const actualYields = Scheduler.unstable_clearYields();
|
||||
expect(actualYields).toEqual(expectedYields);
|
||||
function toMatchValue(LogUtils, expectedValues) {
|
||||
return runAssertion(() => {
|
||||
const actualValues = LogUtils.getAndClearValue();
|
||||
expect(actualValues).toEqual(expectedValues);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
toHaveYielded,
|
||||
toMatchValue,
|
||||
};
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
let dataArray = null;
|
||||
let isWorking = false;
|
||||
|
||||
const injectValue = (value) => {
|
||||
if (dataArray === null) {
|
||||
dataArray = [value];
|
||||
} else {
|
||||
dataArray.push(value);
|
||||
}
|
||||
};
|
||||
|
||||
const getAndClearValue = () => {
|
||||
if (dataArray === null) {
|
||||
return [];
|
||||
}
|
||||
const values = dataArray;
|
||||
dataArray = null;
|
||||
return values;
|
||||
};
|
||||
|
||||
const reset = () => {
|
||||
if (isWorking) {
|
||||
throw new Error('Cannot reset while already flushing work.');
|
||||
}
|
||||
dataArray = null;
|
||||
}
|
||||
|
||||
exports.reset = reset;
|
||||
exports.injectValue = injectValue;
|
||||
exports.getAndClearValue = getAndClearValue;
|
|
@ -1 +0,0 @@
|
|||
jest.mock('scheduler', () => require('./testUtil.js'));
|
|
@ -1,34 +0,0 @@
|
|||
if (process.env.NODE_ENV !== 'production') {
|
||||
(function () {
|
||||
let dataArray = null;
|
||||
let isFlushing = false;
|
||||
|
||||
const unstable_yieldValue = (value) => {
|
||||
if (dataArray === null) {
|
||||
dataArray = [value];
|
||||
} else {
|
||||
dataArray.push(value);
|
||||
}
|
||||
};
|
||||
|
||||
const unstable_clearYields = () => {
|
||||
if (dataArray === null) {
|
||||
return [];
|
||||
}
|
||||
const values = dataArray;
|
||||
dataArray = null;
|
||||
return values;
|
||||
};
|
||||
|
||||
const reset = () => {
|
||||
if (isFlushing) {
|
||||
throw new Error('Cannot reset while already flushing work.');
|
||||
}
|
||||
dataArray = null;
|
||||
}
|
||||
|
||||
exports.reset = reset;
|
||||
exports.unstable_yieldValue = unstable_yieldValue;
|
||||
exports.unstable_clearYields = unstable_clearYields;
|
||||
})();
|
||||
}
|
Loading…
Reference in New Issue