【发布时间】:2020-10-09 09:13:02
【问题描述】:
我创建了一个自定义上下文挂钩 - 我正在努力弄清楚如何在测试期间将值传递给它的提供者。
我的钩子:
import React, { createContext, useContext, useState } from 'react';
const Context = createContext({});
export const ConfigurationProvider = ({ children }) => {
// Use State to keep the values
const [configuration, setConfiguration] = useState({});
// pass the value in provider and return
return (
<Context.Provider
value={{
configuration,
setConfiguration,
}}
>
{children}
</Context.Provider>
);
};
export const useConfigurationContext = () => useContext(Context);
export const { Consumer: ConfigurationConsumer } = Context;
这是它在应用程序中的使用方式:
function App() {
return (
<ConfigurationProvider>
<div className="app">
<ComponentA />
</div>
</ConfigurationProvider>
);
}
在组件A中:
const ComponentA = () => {
// Get configuration
const configuration = useConfigurationContext();
return (
<div>{JSON.stringify(configuration)}</div>
)
}
这一切都很好 - 考虑到我正在从另一个组件调用 setConfiguration 并设置一个对象。现在进入测试部分:
import React, { Component, createContext } from 'react';
import { render, waitFor } from '@testing-library/react';
import ComponentA from 'componentA';
const config = {
propertyA: 'hello',
};
test('renders the config', async () => {
const ConfigurationContext = createContext();
const { queryByText } = render(
<ConfigurationContext.Provider value={config}>
<ComponentA />
</ConfigurationContext.Provider>
);
expect(queryByText('hello')).toBeInTheDocument();
});
这不起作用 - 我希望我发送的值将呈现在 div 中,但上下文是一个空对象。我做错了什么?
【问题讨论】:
-
问题是您在测试中使用的
Provider与您的组件正在使用的不同。您的组件使用您的ConfigurationProvider,而您的测试创建一个新的Context并使用它的Provider。
标签: reactjs testing react-hooks react-testing-library use-context