gpt4 book ai didi

reactjs - 如何使用 jest 和 react-testing-library 测试上下文提供的函数?

转载 作者:行者123 更新时间:2023-12-03 20:14:40 25 4
gpt4 key购买 nike

我有一个 <UserProvider /> 组件,它提供上下文,它的值中有一个 login 方法。在我的测试中,我想检查该方法是否已被调用。如果来自上下文,我如何检查以确保在我的测试中调用此方法?我试过使用 spyOnmock 方法,但我无法让它们工作。

这是我的 UserProvider 组件,它提供了上下文。

import React, { useState, useContext, createContext } from 'react'

const UserContext = createContext()

function UserProvider({ children }) {
const [user, setUser] = useState(null)
const login = user => setUser(user)

return <UserContext.Provider value={{ user, login }}>{children}</UserContext.Provider>
}

const useUser = () => useContext(UserContext)

export { UserProvider, useUser }

这是我使用 Login 上下文的 UserProvider 组件(通过 useUser )
import React from 'react'
import { useUser } from './UserProvider'

function Login() {
const { login } = useUser()

const handleSubmit = async e => {
e.preventDefault()

// I need to make sure this method is being called in my test.
login({ name: 'John Doe' })
}

return (
<form onSubmit={handleSubmit}>
<button>Login</button>
</form>
)
}

export default Login

这是我的 Login 测试
import React from 'react'
import { render, fireEvent } from '@testing-library/react'
import Login from './Login'
import { UserProvider, useUser } from './UserProvider'

// Is this correct?
jest.mock('./UserProvider', () => ({
useUser: jest.fn(() => ({
login: jest.fn()
}))
}))

it('should log a user in', () => {
const { getByText } = render(
<UserProvider>
<Login />
</UserProvider>
)

const submitButton = getByText(/login/i)
fireEvent.click(submitButton)

// How can I make this work?
const { login } = useUser()
expect(login).toHaveBeenCalledTimes(1)
})

我有一个 codesandbox 但它出错了 jest.mock 不是一个函数,所以我不知道它是否非常有用。

最佳答案

如果不稍微更改源代码,我就无法让它工作。

首先,我必须导出实际上下文

export { UserProvider, useUser, UserContext }

我们可以使用模拟的 login 函数重新创建提供程序,以下测试将为您服务。
import React from 'react'
import { render, fireEvent } from '@testing-library/react'
import Login from './Login'
import { UserProvider, useUser, UserContext } from './UserProvider'

it('should log a user in', () => {
const login = jest.fn();
const { getByText } = render(
<UserContext.Provider value={{ login }}>
<Login />
</UserContext.Provider>
);

const submitButton = getByText('Login');
fireEvent.click(submitButton);

expect(login).toHaveBeenCalledTimes(1)
});


这完全有可能不是最好的方法。我希望它有帮助。

关于reactjs - 如何使用 jest 和 react-testing-library 测试上下文提供的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57911684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com