zoukankan      html  css  js  c++  java
  • [React Testing] Test timer related feature in React

    Sometimes your react component may need to do some cleanup work in the return value from useEffect or useLayoutEffect, or the componentWillUnmount lifecycle method for class components. Luckily for us, as far as React Testing Library is concerned, whichever of those you use is an implementation detail, so your test looks exactly the same regardless of how you implement it. Check out how you can test that simply with React Testing Library and a <Countdown />component.

    Component:

    import React from 'react'
    
    function Countdown() {
      const [remainingTime, setRemainingTime] = React.useState(10000)
      const end = React.useRef(new Date().getTime() + remainingTime)
      React.useEffect(() => {
        const interval = setInterval(() => {
          const newRemainingTime = end.current - new Date().getTime()
          if (newRemainingTime <= 0) {
            clearInterval(interval)
            setRemainingTime(0)
          } else {
            setRemainingTime(newRemainingTime)
          }
        })
        return () => clearInterval(interval)
      }, [])
      return remainingTime
    }
    
    export { Countdown }

    Testing:

    import React from 'react'
    import { render, act } from '@testing-library/react'
    import { Countdown } from '../extra/countdown'
    
    beforeAll(() => {
      jest.spyOn(console, 'error').mockImplementation(() => {})
    })
    
    afterAll(() => {
      console.error.mockRestore()
    })
    
    afterEach(() => {
      jest.clearAllMocks()
      jest.useRealTimers()
    })
    
    test('does not attempt to set state when unmounted (to prevent memory leaks)', () => {
      jest.useFakeTimers() // similar to fakeAsync
      const { unmount } = render(<Countdown />)
      unmount()
      // act is similar to Angualr flush
      act(() => jest.runOnlyPendingTimers())
      expect(console.error).not.toHaveBeenCalled()
    })
  • 相关阅读:
    ZOJ 2859 Matrix Searching
    URAL 1102. Strange Dialog
    ZOJ 1986 Bridging Signals
    POJ 3233 Matrix Power Series
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    ZOJ 3471 Most Powerful
    IIS:HTTP 错误 403.9 禁止访问:连接的用户过多
    使用Command对象执行数据库操作
    C#类型转换
  • 原文地址:https://www.cnblogs.com/Answer1215/p/12825014.html
Copyright © 2011-2022 走看看