diff --git a/babel.config.js b/babel.config.js index fec4115a..b7da15b0 100644 --- a/babel.config.js +++ b/babel.config.js @@ -2,7 +2,7 @@ module.exports = { presets: [ '@babel/react', '@babel/preset-typescript', - '@babel/preset-env' + ['@babel/preset-env', { targets: { node: 'current' } }] ], plugins: [ ['@babel/plugin-proposal-class-properties', { loose: true }], diff --git a/jest.config.js b/jest.config.js index b4c134e5..e314fd41 100644 --- a/jest.config.js +++ b/jest.config.js @@ -12,7 +12,7 @@ module.exports = { // browser: false, // The directory where Jest should store its cached dependency information - // cacheDirectory: "C:\\Users\\j30009756\\AppData\\Local\\Temp\\jest", + // cacheDirectory: "", // Automatically clear mock calls and instances between every test // clearMocks: false, @@ -58,15 +58,15 @@ module.exports = { // globalTeardown: undefined, // A set of global variables that need to be available in all test environments - globals: { - 'isDev': process.env.NODE_ENV === 'development', - 'MessageChannel': function MessageChannel() { - this.port1 = {}; - this.port2 = { - postMessage() {} - }; - } - }, + // globals: { + // 'isDev': process.env.NODE_ENV === 'development', + // 'MessageChannel': function MessageChannel() { + // this.port1 = {}; + // this.port2 = { + // postMessage() {} + // }; + // } + // }, // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. // maxWorkers: "50%", @@ -78,12 +78,8 @@ module.exports = { // An array of file extensions your modules use // moduleFileExtensions: [ - // "js", - // "json", - // "jsx", - // "ts", - // "tsx", - // "node" + // 'js', + // 'ts' // ], // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module @@ -120,21 +116,21 @@ module.exports = { // restoreMocks: false, // The root directory that Jest should scan for tests and modules within - // rootDir: undefined, + rootDir: process.cwd(), // A list of paths to directories that Jest should use to search for files in // roots: [ - // "" + // '/scripts' // ], // Allows you to use a custom runner instead of Jest's default test runner // 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/jest/setupHostConfig.js')], + setupFilesAfterEnv: [require.resolve('./scripts/__tests__/jest/setupEnvironment.js')], // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], + setupFiles: [require.resolve('./scripts/__tests__/jest/setupTests.js')], // A list of paths to snapshot serializer modules Jest should use for snapshot testing // snapshotSerializers: [], @@ -150,9 +146,7 @@ module.exports = { // The glob patterns Jest uses to detect test files testMatch: [ - '/scripts/__tests__/**/*.test.js', - '/scripts/__tests__/*.test.js', - '/scripts/__tests__/*.test.jsx', + '/scripts/__tests__/**/*.test.js' ], // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped @@ -173,7 +167,7 @@ module.exports = { // testURL: "http://localhost", // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" - // timers: "real", + timers: 'fake', // A map from regular expressions to paths to transformers // transform: undefined, diff --git a/scripts/__tests__/ComponentTest/SimpleUseHook.test.js b/scripts/__tests__/ComponentTest/SimpleUseHook.test.js index fc0821d1..238dc4d4 100644 --- a/scripts/__tests__/ComponentTest/SimpleUseHook.test.js +++ b/scripts/__tests__/ComponentTest/SimpleUseHook.test.js @@ -4,7 +4,7 @@ import { act } from 'react-dom/test-utils'; describe('Hook Test', () => { - const { useState, useReducer, useEffect, useLayoutEffect, useContext } = React; + const { useState, useReducer, useEffect, useLayoutEffect, useContext, useMemo, useCallback, useRef, useImperativeHandle, forwardRef } = React; const { unmountComponentAtNode } = HorizonDOM; let container = null; beforeEach(() => { @@ -33,7 +33,7 @@ describe('Hook Test', () => { } HorizonDOM.render(, container); expect(container.querySelector('p').innerHTML).toBe('0'); - //点击按钮触发num加1 + // 点击按钮触发num加1 container.querySelector('button').click(); expect(container.querySelector('p').innerHTML).toBe('1'); }); @@ -53,7 +53,7 @@ describe('Hook Test', () => { } HorizonDOM.render(, container); expect(document.getElementById('p').style.display).toBe('block'); - //点击按钮触发num加1 + // 点击按钮触发num加1 container.querySelector('button').click(); expect(document.getElementById('p').style.display).toBe('none'); container.querySelector('button').click(); @@ -111,13 +111,13 @@ describe('Hook Test', () => { ) } HorizonDOM.render(, container); - //测试当Provider未提供时,获取到的默认值'JavaScript'。 + // 测试当Provider未提供时,获取到的默认值'JavaScript'。 expect(container.querySelector('p').innerHTML).toBe('JavaScript'); unmountComponentAtNode(container); HorizonDOM.render(, container); - //测试当Provider提供时,可以获取到Provider的值'Java'。 + // 测试当Provider提供时,可以获取到Provider的值'Java'。 expect(container.querySelector('p').innerHTML).toBe('Java'); - //测试当Provider改变时,可以获取到最新Provider的值。 + // 测试当Provider改变时,可以获取到最新Provider的值。 act(() => setValue(LanguageTypes.JAVASCRIPT)); expect(container.querySelector('p').innerHTML).toBe('JavaScript'); }); @@ -166,13 +166,136 @@ describe('Hook Test', () => { HorizonDOM.render(, container); expect(container.querySelector('p').innerHTML).toBe(''); expect(container.querySelector('#senP').innerHTML).toBe('0'); - //触发bmw + // 触发bmw dispatch({ logo: 'bmw' }); expect(container.querySelector('p').innerHTML).toBe('bmw'); expect(container.querySelector('#senP').innerHTML).toBe('100'); - //触发carReducer里的switch的default项 + // 触发carReducer里的switch的default项 dispatch({ logo: 'wrong logo' }); expect(container.querySelector('p').innerHTML).toBe('audi'); expect(container.querySelector('#senP').innerHTML).toBe('88'); }); + + it('测试useMemo', () => { + let setMemo; + const App = () => { + const [num, setNum] = useState(0); + const [memoDependent, _setMemo] = useState('App'); + setMemo = _setMemo; + const text = useMemo(() => { + setNum(num + 1); + return memoDependent; + }, [memoDependent]) + return ( + <> +

{text}

+

{num}

+ + ); + } + HorizonDOM.render(, container); + expect(container.querySelector('p').innerHTML).toBe('App'); + expect(container.querySelector('#p').innerHTML).toBe('1'); + // 修改useMemo的依赖项,num会加一,text会改变。 + setMemo('Apps') + expect(container.querySelector('p').innerHTML).toBe('Apps'); + expect(container.querySelector('#p').innerHTML).toBe('2'); + // useMemo的依赖项不变,num不会加一,text不会改变。 + setMemo('Apps') + expect(container.querySelector('p').innerHTML).toBe('Apps'); + expect(container.querySelector('#p').innerHTML).toBe('2'); + // 修改useMemo的依赖项,num会加一,text会改变。 + setMemo('App') + expect(container.querySelector('p').innerHTML).toBe('App'); + expect(container.querySelector('#p').innerHTML).toBe('3'); + }); + + it('测试useCallback', () => { + const App = (props) => { + const [num, setNum] = useState(0); + const NumUseCallback = useCallback(() => { + setNum(num + props.text) + }, [props]); + return ( + <> +

{num}

+