【发布时间】:2019-07-12 00:43:02
【问题描述】:
我正在尝试为 @material-ui/core/styles 模块创建手动模拟,该模块导出名为 withStyles 的 HOC。
使用带有jest.mock 的内联模拟效果很好,但是当我尝试将此逻辑移动到可共享的__mocks__ 文件夹中时,它不再起作用了。
我从正在测试的文件中删除了所有不必要的代码,只保留了造成问题的两行:
import { withStyles } from '@material-ui/core/styles';
console.log('loaded styles:', withStyles);
export default 'hello';
并且测试也简化了,只是为了看看模拟是否工作,如下:
import test from '../test';
console.log(test);
我尝试的是在项目的根目录中创建一个__mocks__ 文件夹,其中我有node_modules 文件夹。
在那里,我创建了一个名为 @material-ui 的第一个文件夹,并在其中创建了另一个名为 core 的文件夹。
在这个文件夹中,我有一个名为 styles.js 的文件,代码如下:
export const withStyles = 'hello world';
所以结构看起来像:
- __mocks__
- @material-ui
- core
- styles.js
- node_modules
这是有效的代码,在同一个测试文件中定义了模拟:
jest.mock('@material-ui/core/styles', () => ({
withStyles: () => Component => props => (
<Component
classes=""
{...props}
/>
),
}));
__mocks__ 文件夹发生的情况是,如果我不调用任何文件夹
jest.mock('@material-ui/core/styles');
在我的测试文件中,它使用了真正的withStyles,所以是真正的模块。
根本没有使用任何模拟。
如果我使用:
jest.mock('@material-ui/core/styles');
它使用由 jest 自动生成的自动模拟(或者看起来是这样),跳过了我在上面定义的模拟。
只是关于软件包的说明,我使用 CRA 引导应用程序,我目前拥有的 jest 版本是 20,react-scripts 版本是 1.0.17
感谢大家的帮助!
【问题讨论】:
-
我找到了在 (
__mocks__/@material-ui/core/styles.js) 中手动模拟 makeStyles 的完美方法,方法是使用与在旅途中创建的主题绑定的相同原始 makeStyles。这解决了来自undefined theme、测试覆盖、在makeStyles函数属性中通过props的未发现测试的所有问题。如果你仍然想要这个,我会花点时间来回答它,因为它还处理jest.spyOn(React, 'useContext').mockImplementation(() => {}),它会导致一些useStyles崩溃,这些React.useContext也在内部使用。 -
和
withStyles类似,但是makeStyles更适合Hook,我用的就是这个。但同样的逻辑也适用。 -
另外,你不应该在手动模拟中使用
jest.mock('@material-ui/core/styles');。在 Manual Mock 中,您必须返回任何您想要的内容来代替styles。例如,您可以只导入所有样式,准备一个withStyles函数并返回{ ....Styles. withStyles }以替换withStyles。
标签: javascript reactjs mocking jestjs material-ui