Jestjs 从正在测试的组件外部访问上下文API

Jestjs 从正在测试的组件外部访问上下文API,jestjs,react-testing-library,Jestjs,React Testing Library,我正在使用Jest和React测试库来测试React组件。我使用上下文API提供程序呈现了一个组件,因此该组件可以访问上下文。不幸的是,我不知道如何从渲染组件外部访问它。在这种情况下,上下文中有一个isUserLogged属性,具体取决于组件的更改。但是我不知道我怎么能改变这个财产的价值。我怎么处理这个案子?如果需要模拟上下文API,我该怎么做 在附加的代码中,我尝试使用useContext钩子访问上下文。错误表明我不能在React组件之外使用钩子。而且,很明显,我试图在上下文提供程序之外访问上

我正在使用Jest和React测试库来测试React组件。我使用上下文API提供程序呈现了一个组件,因此该组件可以访问上下文。不幸的是,我不知道如何从渲染组件外部访问它。在这种情况下,上下文中有一个
isUserLogged
属性,具体取决于组件的更改。但是我不知道我怎么能改变这个财产的价值。我怎么处理这个案子?如果需要模拟上下文API,我该怎么做

在附加的代码中,我尝试使用useContext钩子访问上下文。错误表明我不能在React组件之外使用钩子。而且,很明显,我试图在上下文提供程序之外访问上下文,所以无论如何它都不会工作

import { Provider, Context } from '../../context';

test('Star is not clickable for a non-registered user', () => {
  const { getByTestId } = render(<Provider><Star /></Provider>);
  const isUserLogged = useContext(Context).isUserLogged; // Error.
});
从“../../Context”导入{Provider,Context};
测试('非注册用户不能点击星号',()=>{
const{getByTestId}=render();
const isUserLogged=useContext(Context).isUserLogged;//错误。
});

您只需将
提供者
传递给
道具即可。这就是你在应用程序中的做法

const isUserLogged = true
render(<Provider value={{ isUserLogged }}><Star /></Provider>)
const isUserLogged=true
render()

这是我访问上下文以初始化状态以准备测试功能的方式:

let authContext

const TestWrapper = ({ children }) => {
  authContext = useContext(AuthContext)

  return children
}

const renderer = renderHook(() => useAuth(), {
  wrapper: ({ children }) => (
    <AuthProvider>
      <TestWrapper>{children}</TestWrapper>
    </AuthProvider>
  ),
})

act(() => {
  authContext.setUser(user)
})

// hook that uses the same context now have 'user' initialised
让authContext
const TestWrapper=({children})=>{
authContext=useContext(authContext)
返回儿童
}
const renderer=renderHook(()=>useAuth(){
包装器:({children})=>(
{儿童}
),
})
行动(()=>{
authContext.setUser(用户)
})
//使用相同上下文的钩子现在已初始化“user”

可能是不同的事情。可能有另一个提供者正在覆盖您的值。或者,您在测试中导入的上下文可能与您在组件中使用的上下文不同。还有一个问题,Gpx。如果在一个测试文件中有两个测试,那么第二个测试将失败,尽管isUserLogged的值为true。当我注释掉1号测试时,一切又开始工作了。这里怎么了?哦,我知道了。react测试库中的清理函数应该在每次测试后运行,以卸载和清理DOM。