包含Context.Provider和Context.Consumer的反应上下文测试组件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了包含Context.Provider和Context.Consumer的反应上下文测试组件相关的知识,希望对你有一定的参考价值。
我正在尝试测试一个既包含React Context的提供者又包含使用者的组件。请参阅下面的App.tsx。该提供程序位于还处理状态的包装器类中。
[我如何模拟ConfigurationContextProvider包装器类,以便它可以将loadedStatus
值正确提供给使用者以测试App.tsx的各种呈现方式?
App.tsx:
public render(): React.ReactNode
return (
<ConfigurationContextProvider>
<ConfigurationContext.Consumer>
(
loadedStatus,
): ReactElement =>
switch( loadedStatus )
case ConfigStatus.GoodConfiguration:
return ( this.renderApp());
case ConfigStatus.NotLoaded:
return ( this.renderUnloadedApp() );
case ConfigStatus.BadConfiguration:
return ( this.renderBadConfiguration() );
</ConfigurationContext.Consumer>
</ConfigurationContextProvider>
)
ContextProvider.tsx:
export const ConfigurationContext = React.createContext<ConfigurationState | undefined>(undefined);
export enum ConfigStatus
NotLoaded,
BadConfiguration,
GoodConfiguration
export interface ConfigurationState
loadedStatus: ConfigStatus;
baseUrl: URL;
export class ConfigurationContextProvider extends Component< , ConfigurationState>
constructor( props: )
super(props);
this.state =
loadedStatus: ConfigStatus.NotLoaded,
baseUrl: null
async componentDidMount(): Promise<void>
await this.loadConfiguration();
setConfiguration(configuration: Response): void
const URL_KEY = 'BASE_URL';
const URL_VALUE = configuration[URL_KEY];
if (!Object.prototype.hasOwnProperty.call(configuration, URL_KEY))
this.setState( loadedStatus: ConfigStatus.BadConfiguration );
console.error(`Missing field in configs: $ URL_KEY `);
else
try
this.setState(
loadedStatus: ConfigStatus.GoodConfiguration,
baseUrl: new URL(URL_VALUE),
);
catch
this.setState( loadedStatus: ConfigStatus.BadConfiguration );
console.error(`Bad URL in environment configs - $ URL_KEY : $ URL_VALUE `);
loadConfiguration(): Promise<void>
const configPromise: Promise<Response> = fetch('./env.json');
return configPromise.then( (response) => response.json())
.then( (config: Response) => this.setConfiguration(config));
render(): React.ReactNode
return (
<ConfigurationContext.Provider value =
...this.state,
>
this.props.children
</ConfigurationContext.Provider>
)
最简单的方法是使用ConfigurationContextProvider的spyOn loadConfig函数并根据需要将响应设置为setConfig。这种方法可以测试各种结果,并根据需要进行完整的上下文/状态更新。
jest.spyOn(
ConfigurationContextProvider.prototype, 'loadConfiguration').mockImplementation(
function(this: ConfigurationContextProvider)
this.setConfiguration( BASE_URL: 'http://localhost:8080' );
return Promise.resolve();
);
以上是关于包含Context.Provider和Context.Consumer的反应上下文测试组件的主要内容,如果未能解决你的问题,请参考以下文章
为啥第二个(兄弟)React Context Provider 不起作用?或者,如果上面有同级 Context Provider,为啥 React Context Provider 不起作用
是否可以在多个组件上使用相同的 <Context.Provider> ?
如何访问反应Context.Provider值中的另一个函数?
除了 value 道具之外的任何道具都可以在 Context.Provider 中工作吗
如何创建一个`context.Provider` /`context.Consumer`-like结构来传递bot应用程序中的值?