|
|
@@ -0,0 +1,55 @@
|
|
|
+import {useContextSection, useContext} from '@hooks';
|
|
|
+import {createContext} from 'use-context-selector';
|
|
|
+import {act, renderHook} from '@testing-library/react';
|
|
|
+import {useState} from 'react';
|
|
|
+
|
|
|
+describe('context hooks', function() {
|
|
|
+ it('useContextSection, useContext类型正确', function() {
|
|
|
+ expect(useContextSection).toBeDefined();
|
|
|
+ expect(useContext).toBeDefined();
|
|
|
+
|
|
|
+ expect(useContextSection).toBeInstanceOf(Function);
|
|
|
+ expect(useContext).toBeInstanceOf(Function);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('useContextSection 返回值检测', function() {
|
|
|
+ const {result} = renderHook(function() {
|
|
|
+ const state = useState({name: '', age: 2});
|
|
|
+ const context = createContext(state);
|
|
|
+ return useContextSection(context, state => state);
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(result.current[0]).toEqual({name: '', age: 2});
|
|
|
+
|
|
|
+ act(function() {
|
|
|
+ result.current[1](val => ({...val, name: 'simon'}));
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(result.current[0]).toEqual({name: 'simon', age: 2});
|
|
|
+ });
|
|
|
+
|
|
|
+ it('useContextSection 防止重新渲染', function() {
|
|
|
+ const {result} = renderHook(function() {
|
|
|
+ const state = useState({name: '', age: 2});
|
|
|
+ const context = createContext(state);
|
|
|
+
|
|
|
+ const section1 = useContextSection(context, function([{name}, dispatch]) {
|
|
|
+ return [name, dispatch] as const;
|
|
|
+ });
|
|
|
+
|
|
|
+ const section2 = useContextSection(context, function([{age}, dispatch]) {
|
|
|
+ return [age, dispatch] as const;
|
|
|
+ });
|
|
|
+
|
|
|
+ return {section1, section2};
|
|
|
+ });
|
|
|
+
|
|
|
+ const memoState = result.current.section1;
|
|
|
+
|
|
|
+ act(function() {
|
|
|
+ result.current.section2[1](prev => ({...prev, age: 12}));
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(memoState).toBe(result.current.section1);
|
|
|
+ });
|
|
|
+});
|