useContextSection.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import {useContextSection, useContext} from '@hooks';
  2. import {createContext} from 'use-context-selector';
  3. import {act, renderHook} from '@testing-library/react';
  4. import {useState} from 'react';
  5. describe('context hooks', function() {
  6. it('useContextSection, useContext类型正确', function() {
  7. expect(useContextSection).toBeDefined();
  8. expect(useContext).toBeDefined();
  9. expect(useContextSection).toBeInstanceOf(Function);
  10. expect(useContext).toBeInstanceOf(Function);
  11. });
  12. it('useContextSection 返回值检测', function() {
  13. const {result} = renderHook(function() {
  14. const state = useState({name: '', age: 2});
  15. const context = createContext(state);
  16. return useContextSection(context, state => state);
  17. });
  18. expect(result.current[0]).toEqual({name: '', age: 2});
  19. act(function() {
  20. result.current[1](val => ({...val, name: 'simon'}));
  21. });
  22. expect(result.current[0]).toEqual({name: 'simon', age: 2});
  23. });
  24. it('useContextSection 防止重新渲染', function() {
  25. const {result} = renderHook(function() {
  26. const state = useState({name: '', age: 2});
  27. const context = createContext(state);
  28. const section1 = useContextSection(context, function([{name}, dispatch]) {
  29. return [name, dispatch] as const;
  30. });
  31. const section2 = useContextSection(context, function([{age}, dispatch]) {
  32. return [age, dispatch] as const;
  33. });
  34. return {section1, section2};
  35. });
  36. const memoState = result.current.section1;
  37. act(function() {
  38. result.current.section2[1](prev => ({...prev, age: 12}));
  39. });
  40. expect(memoState).toBe(result.current.section1);
  41. });
  42. });