尽量不要模拟第三方库函数的实现,因为不正确的模拟实现会破坏其功能。例如
   
    useEffect(effect)
   
   react钩子不只是执行
   
    effect
   
   作用考虑
  
  
   
    反应推迟了跑步
    
     useEffect
    
    直到浏览器绘制完毕。
   
  
  
   你怎么嘲笑它?不正确的模拟将导致意外行为。基于不正确的模拟实现,您的测试可能会通过,但代码在实际运行时会失败。这就是为什么你最好不要嘲笑第三方库。当然,这不是绝对的。如果第三方库的功能简单且自包含,则可以对其进行模拟。
  
  
   对于React组件,我们应该进行黑盒测试,只测试组件的行为和功能,而不是实现。我们应该将组件视为一个单元,而不是其中的函数。
  
  
   我们应该测试当
   
    pageLoaded
   
   州变了。
  
  
   函数组件内部定义的事件处理程序是私有的,您不能从外部访问它们(测试代码)。所以你不能直接调用它们。相反,您应该通过用户事件触发它们。这个
   
    load
   
   为你的案子准备的活动。
  
  
   例如。
  
  
   
    index.tsx
   
   :
  
  import React from 'react';
import { useEffect, useState } from 'react';
export const RatingsAndReviews = (props) => {
  const [pageLoaded, setPageLoaded] = useState<boolean>(false);
  console.log('pageLoaded: ', pageLoaded);
  const handleLoad = () => {
    if (document.readyState === 'complete') {
      setTimeout(() => {
        setPageLoaded(true);
      }, 1500);
    }
  };
  useEffect(() => {
    window.addEventListener('load', handleLoad);
    return () => {
      window.removeEventListener('load', handleLoad);
    };
  }, []);
  return <div>{pageLoaded ? 'loaded' : 'not loaded'}</div>;
};
  
   
    index.test.tsx
   
   :
  
  import { mount } from 'enzyme';
import React from 'react';
import { act } from 'react-dom/test-utils';
import { RatingsAndReviews } from '.';
describe('RatingsAndReviews', () => {
  it('Should run handleLoad function onMount', () => {
    jest.useFakeTimers();
    const wrapper = mount(<RatingsAndReviews />);
    window.dispatchEvent(new Event('load'));
    expect(wrapper.text()).toBe('not loaded');
    act(() => {
      jest.advanceTimersByTime(1500);
    });
    expect(wrapper.text()).toBe('loaded');
  });
});
  
   测试结果:
  
   PASS  stackoverflow/71953030/index.test.tsx (11.883 s)
  RatingsAndReviews
    â Should run handleLoad function onMount (47 ms)
  console.log
    pageLoaded:  false
      at RatingsAndReviews (stackoverflow/71953030/index.tsx:7:11)
  console.log
    pageLoaded:  true
      at RatingsAndReviews (stackoverflow/71953030/index.tsx:7:11)
-----------|---------|----------|---------|---------|-------------------
File       | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-----------|---------|----------|---------|---------|-------------------
All files  |   93.33 |       75 |      80 |   92.86 |                   
 index.tsx |   93.33 |       75 |      80 |   92.86 | 19                
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        13.575 s, estimated 14 s
  
   软件包版本:
  
  "enzyme": "^3.11.0",
"enzyme-adapter-react-16": "^1.15.5",
"react": "^16.14.0",
"react-dom": "^16.14.0",
"jest": "^26.6.3",