开玩笑模拟反应上下文
Jest mock 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
.
这是我 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
编写单元测试。
您只需使用您的组件呈现上下文。
const addItem = jest.fn()
render(
<AppContext.Provider value={{ addItem }}>
<MyComponent />
</AppContext.Provider>
)
我想使用@Giorgio 的解决方案添加一个完整的测试示例。
这里我们正在测试 MyComponent 是否被渲染并且它的按钮将被点击一次。
MyComponent.test.js
import React from 'react'
import { render, fireEvent } from 'react-testing-library'
test('component handles button click', () => {
const addItem = jest.fn()
render(
<AppContext.Provider value={{ addItem }}>
<MyComponent />
</AppContext.Provider>
)
fireEvent.click(screen.getByText(/click me/))
expect(addItem).toHaveBeenCalledTimes(1)
}
我需要一些帮助来了解如何使用 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
编写单元测试。
您只需使用您的组件呈现上下文。
const addItem = jest.fn()
render(
<AppContext.Provider value={{ addItem }}>
<MyComponent />
</AppContext.Provider>
)
我想使用@Giorgio 的解决方案添加一个完整的测试示例。 这里我们正在测试 MyComponent 是否被渲染并且它的按钮将被点击一次。
MyComponent.test.js
import React from 'react'
import { render, fireEvent } from 'react-testing-library'
test('component handles button click', () => {
const addItem = jest.fn()
render(
<AppContext.Provider value={{ addItem }}>
<MyComponent />
</AppContext.Provider>
)
fireEvent.click(screen.getByText(/click me/))
expect(addItem).toHaveBeenCalledTimes(1)
}