我需要一些帮助来理解如何使用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
。
下面是我的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
,以便实际验证单击按钮是否会触发函数调用?
我知道理论上我可以通过在App
中渲染MyComponent
来测试它,但是我只想为MyComponent
编写一个单元测试。
3条答案
按热度按时间inn6fuwd1#
您只需使用组件呈现上下文。
参见Mocking context with react-testing-library
km0tfn4u2#
我想通过使用@Giorgio的解决方案添加一个完整的测试示例。这里我们测试MyComponent是否被渲染,并且它的按钮是否被点击一次。
MyComponent.test.js
dwthyt8l3#
如果有任何TypeScript用户无法使用此解决方案,我想为任何有困难的人添加我的测试示例。
在我的例子中,我添加了一个定制的组件 Package 器,它可以在应用程序的测试环境中重用。如果您要测试嵌套在希望模拟的上下文中的多个组件,这会很方便。
作为奖励,我还模仿了rxjs行为主题,以防有人在测试中使用这个库: