reactjs - 为什么我的子组件“主题”在酶“安装”中未定义?
问题描述
我正在尝试在我们的 jest/enzyme 单元测试中使用 styled-components 设置主题。我创建了一个useTheme
钩子,它将从样式组件的 ThemeContext 返回当前主题。
export const useTheme = (): Theme => {
return React.useContext<Theme>(ThemeContext)
};
然后,我创建了一个自定义挂载函数,将我测试过的组件包装在提供程序中:
const CustomThemeProvider = ({
children,
}: Omit<ThemeProviderProps<Theme, Theme>, 'theme'>) => (
<ThemeProvider theme={lightTheme}>{children}</ThemeProvider>
);
const customMount = (
node: React.ReactElement<any>,
options?: MountRendererProps
) => {
return mount(node, {
wrappingComponent: CustomThemeProvider,
...options,
});
};
我现在只有一个使用useTheme
钩子的组件,并且该组件的测试通过并且很好。但是,当我测试其中包含该组件的组件时,测试套件无法运行,并出现一个错误,基本上说theme
未定义(从钩子返回的内容)。下面的测试设置示例在其中返回Icon
的组件在哪里,除非我在自己的单元测试中。useTheme
undefined
beforeEach(() => {
wrapper = mount(
<Button>
Easy
<Icon icon="heart" role="presentation" />
</Button>
);
});
我已经在谷歌上搜索了几天,这超出了我的其他工程师的头脑,所以我不确定为什么没有像我期望的那样将主题提供给子组件。我已经尝试在 ThemeProviders 中包装所有内容,取消注释Icon
让我运行测试,但理想情况下我可以使用它运行它(很可能需要它用于其他组件)。尝试使用调试器运行,但没有什么明显的跳出给我。
解决方案
推荐阅读
- html - CSS:在 iOS 13 上禁用滚动反弹效果
- gradle - Gadle - 将 jar 文件包含到 jar 文件中
- puppeteer - Puppeteer => 如何在标签的循环中访问所有内容
- ajax - symfony 在表单中嵌入 Ajax 字段
- python - 将现有的 ModelSerializer 与 JSONResponse 一起使用
- java - 在 antlr 访问者模式中,如何从一种方法导航到另一种方法
- python - 目前正在学习从文件中读取
- android - 我的“JobIntentService”在后台运行不佳
- ruby-on-rails - 如何使用 FactoryBot 修复 rspec 测试中的“未定义方法”枚举?
- c# - 如何使用正则表达式在and和 and之间创建一个数组?