首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么用react测试库测试的React组件与react交集观察者有问题?

为什么用react测试库测试的React组件与react交集观察者有问题?
EN

Stack Overflow用户
提问于 2022-05-07 15:38:09
回答 1查看 601关注 0票数 3

我编写了一个用react 17.0.2构建的组件,该组件使用react-intersection-observer 9.1.0

代码语言:javascript
复制
  import { useInView } from 'react-intersection-observer'

  ...

  const [ref, inView] = useInView({
    threshold: 0.99,
    root: scrollRef.current,
    delay: 250,
    trackVisibility: true,
    onChange: (inView: boolean) => {
      onChildInView(index, inView)
    }
  })

若要检测视口内外的滑动行为,请执行以下操作。组件工作得很好。

我使用@testing-library/react 12.1.4和@testing-library/jest-dom 5.16.3编写了一些单元测试,以使组件更安全。

一旦我用下面的代码测试上述组件的存在或可见性

代码语言:javascript
复制
  describe('method render', () => {
    test('renders correctly', () => {
      render(
        <MyComponent
          props={...}
          data-testid="component-id"
        >
          <div />
          <div />
        </MyComponent>
      )

      const componentNode = screen.getByTestId('component-id')

      expect(componentNode).toBeInTheDocument()
      expect(componentNode).toBeVisible()
    })
  })

测试库会发出消息错误的通知。

代码语言:javascript
复制
    ReferenceError: IntersectionObserver is not defined

我试图通过在测试顶部模拟库(如链接这里)来修复它。

代码语言:javascript
复制
  const intersectionObserverMock = () => ({
    observe: () => null
  })

  declare global {
    interface Window {
      IntersectionObserver: typeof IntersectionObserver
    }
  }

  window.IntersectionObserver = jest.fn().mockImplementation(intersectionObserverMock);

但是它没有工作,因为

代码语言:javascript
复制
  TypeError: observer.unobserve is not a function

有什么建议吗?遗漏了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-09 15:05:45

要解决这个问题,我建议使用mockAllIsIntersecting ( test-utils.js in react-intersection-observer )。这个函数模拟IntersectionObserver。

例如:

代码语言:javascript
复制
import { mockAllIsIntersecting } from 'react-intersection-observer/test-utils';   

describe('method render', () => {
    test('renders correctly', () => {
      render(
        <MyComponent
          props={...}
          data-testid="component-id"
        >
          <div />
          <div />
        </MyComponent>
      )

      mockAllIsIntersecting(true)

      const componentNode = screen.getByTestId('component-id')

      expect(componentNode).toBeInTheDocument()
      expect(componentNode).toBeVisible()
    })
  })
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72154008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档