我需要一些帮助,以帮助您了解如何使用来测试应用程序React Context。
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
这是一个简化的示例。想象在App和之间有更多的层MyComponent,因此使用React Context。
App
MyComponent
这是我的测试文件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.Consumer是的实现的一部分MyComponent,因此在此测试中,我无法直接访问它。我该如何模拟,AppContext.Consumer以便实际上可以验证单击按钮会触发函数调用?
AppContext.Consumer
我知道从理论上讲我可以通过MyComponent在自己的渲染中进行测试App,但是我只想编写一个单元测试MyComponent。
您只需使用组件渲染上下文。
const addItem = jest.fn() render( <AppContext.Provider value={{ addItem }}> <MyComponent /> </ApppContext.Provider> )
请参阅使用react-testing-library模拟环境