reactjs - 开 Jest 模拟 react 上下文

标签 reactjs unit-testing jestjs react-context react-testing-library

我需要一些帮助来了解如何使用 React Context 测试应用程序。

这是我的示例设置。

context.js

import React from 'react'

export const AppContext = React.createContext()

App.js

import React from 'react'

import MyComponent from './MyComponent'
import {AppContext} from './context'

const App extends React.Component {

  state = {
    items: []
  }

  handleItemAdd = newItem => {
    const {items} = this.state
    items.push(newItem)
    this.setState(items)
  }

  render() {
    return (
      <AppContext.Provider value={{
        addItem: this.handleItemAdd
      }}>
        <MyComponent />
      </AppContext.Provider>
    )
  }
}

export default App

MyComponent.js

import React from 'react'

import {AppContext} from './context'

const MyComponent extends React.Component {    
  render() {
    return (
      <AppContext.Consumer>
        {addItem => 
          <button onClick={() => addItem('new item')}>
            Click me
          </button>
        }
      </AppContext.Consumer>
    )
  }
}

export default MyComponent

这是一个简化的示例。想象一下,AppMyComponent 之间有更多层,因此使用 React Context

这是我的 MyComponent 测试文件。

MyComponent.test.js

import React from 'react'
import {render, fireEvent} from 'react-testing-library'

test('component handles button click', () => {
  const {getByText} = render(
    <MyComponent />
  )
  const button = getByText('Click me')
  fireEvent.click(button)
  expect...?
}

问题是,AppContext.ConsumerMyComponent 实现的一部分,因此在这个测试中我无法直接访问它。如何模拟 AppContext.Consumer 以便我实际上能够验证单击按钮是否会触发函数调用?

我知道理论上我可以通过在我的 App 中渲染 MyComponent 来测试它,但我想为 MyComponent 编写一个单元测试仅。

最佳答案

您只需使用组件渲染上下文即可。

const addItem = jest.fn()
render(
  <AppContext.Provider value={{ addItem }}>
    <MyComponent />
  </AppContext.Provider>
)

参见Mocking context with react-testing-library

关于reactjs - 开 Jest 模拟 react 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54292298/

相关文章:

javascript - Jest - 断言异步函数引发测试失败

reactjs - 使用 jest.fn 时,值必须是模拟或 spy 函数

javascript - React中定义方法的两种方式,有什么不同?

c# - Moq:Lambda 表达式作为参数并在返回中评估它们

database - Laravel 5 为测试之间的单元测试重新播种数据库

python - 猴子在Python的另一个模块中修补一个类

javascript - Redux Saga 未触发/api 未调用 - props 未定义

reactjs - React-router-dom NavLink 不呈现但转到路径

css - 如何在 JS 中使用 css 来实现嵌套悬停样式、Material UI

reactjs - 使用 Enzyme 和 Jest 在 React 中测试 handle change 函数