- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 @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');
CRA
用于引导应用程序和
jest
我目前拥有的版本是 20,带有
react-scripts
版本 1.0.17
最佳答案
以下是您应该如何在 __mocks__/@material-ui/core/styles.js
中使用手动模拟:
// Grab the original exports
import * as Styles from '@material-ui/core/styles';
const mockWithStyles = () => {
console.log('withStyles being mocked'); // this shows that it works
/**
* Note: if you want to mock this return value to be
* different within a test suite then use
* the pattern defined here:
* https://jestjs.io/docs/en/manual-mocks
*/
return () => {}; // your mock function (adjust as needed)
// you can also return the same implementation on certain conditions
// return Styles.makeStyles;
};
module.exports = { ...Styles, withStyles: mockWithStyles };
这是我手动模拟
makeStyles
的方法:
// Grab the original exports
// eslint-disable-next-line import/no-extraneous-dependencies
import * as Styles from '@material-ui/core/styles';
import createMuiTheme from '@material-ui/core/styles/createMuiTheme';
import options from '../../../src/themes/options';
const mockMakeStyles = func => {
/**
* Note: if you want to mock this return value to be
* different within a test suite then use
* the pattern defined here:
* https://jestjs.io/docs/en/manual-mocks
*/
/**
* Work around because Shallow rendering does not
* Hook context and some other hook features.
* `makeStyles` accept a function as argument (func)
* and that function accept a theme as argument
* so we can take that same function, passing it as
* parameter to the original makeStyles and
* binding it with our custom theme
*/
const theme = createMuiTheme(options);
return Styles.makeStyles(func.bind(null, theme));
};
module.exports = { ...Styles, makeStyles: mockMakeStyles };
和
makeStyles
结果使用
React.useContext
,所以我们必须避免 mock
useContext
对于
makeStyles
.使用
mockImplementationOnce
如果您使用
React.useContext(...)
首先在你的组件中,或者只是在你的测试代码中过滤掉它:
jest.spyOn(React, 'useContext').mockImplementation(context => {
console.log(context);
// only stub the response if
if (context.displayName === 'MyAppContext') {
return {
auth: {},
lang: 'en',
snackbar: () => {},
};
}
const ActualReact = jest.requireActual('react');
return ActualReact.useContext(context);
});
在您的
createContext()
上电话,可能在
store.js
, 添加
displayName
(标准),或任何其他自定义属性来识别您的上下文:
const store = React.createContext(initialState);
store.displayName = 'MyAppContext';
makeStyles
上下文 displayName 将显示为
StylesContext
和
ThemeContext
并且它们的实现将保持不变以避免错误。
makeStyles
的所有类型的模拟问题.但是我没用过
withStyles
要深入了解它的结构,但应该适用类似的逻辑。
关于javascript - 在 React with Jest 中为 @material-ui withStyles 创建手动模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54750544/
这是我的代码 import { withStyles, MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles'; impo
import * as React from "react"; import Button from "@material-ui/core/Button"; import * as PropTyp
我想在 withStyles 中使用 min()。 我现在这样声明它: maxWidth: "min(700, 90vw)" 我也试过 maxWidth: "min('700', '90vw')" 这
在尝试将我的 React 应用程序转换为 typescript 时,我不断收到以下错误,而且我一直无法弄清楚它在说什么。该应用程序在纯 JS 中运行良好。我正在使用 material-ui@next
我正在尝试将仪表板的组件拆分为更小的组件。但是,所有组件都依赖于 drawerWidth。我的第一个想法是让 drawerWidth 进入状态,这样我就可以将它传递给每个组件。但是,可变样式取决于 d
例如。 Child.js //assume there is s as styles object and used in this component class Child extends Com
我有以下内容: class StyledInput extends React.Component{ styles = (color, theme) => ({ underline: {
我的 package.json 看起来像这样。该应用程序工作正常,直到不久前我突然收到此错误。 "@material-ui/icons": "1.0.0-beta.42", "chartist
如何在 material-ui/core/styles.js 中模拟 withStyles 的实现? 这是测试: import React from 'react' import { shallow
当我将鼠标悬停在具有类 friendsListItem 的 ListItem 上时,我希望隐藏具有类操作的 ListItemSecondaryAction 元素。 我试过在样式中使用 decedent
我正在使用 material-ui withStylers 和 defaultProps 创建一个组件,但是当我尝试使用组件的 props 时,在样式对象中,我从来没有得到我的默认 props 的值,
我看了一下 this question ,但仍然设法让它发挥作用。 目的是将样式与组件文件分开,以便进行更清晰的设置。 当没有 theme 涉及时,它工作正常。 我确实尝试了几次迭代,有或没有包装 w
我正在做 react 项目,在这个项目中,我和我的同事正在使用 Material UI,出于某种原因,我想访问 DOM 节点 由 HOC 包装的另一个组件。为此,我使用了 React ref。但我只是
我的任务是让我们的 React redux 网络应用程序中的页面加载速度更快。 当加载页面的 Action 触发时,我们会看到大约 0.5 秒的小停顿。 我打开了探查器,乍一看似乎没有任何问题。 Fl
每个都有不同的用例吗?什么时候应该使用 withStyles 而不是 makeStyles? 最佳答案 更新 此问题/答案适用于 Material-UI 的 v4。我在最后添加了一些 v5 信息/链接
我正在尝试弄清楚如何注释以下样式的类型(我从纯 JavaScript 转换为 TypeScript 并添加了类型注释): import * as React from 'react' import {
在 React with material-ui 中,我尝试创建一个 JSX 组件,它接受通用参数并使用 withStyles HOC 来注入(inject)我的样式。 第一种方法是这样的: cons
我注意到用 生成的类makeStyles 并且钩子(Hook)的使用遵循以下命名法: 而用 生成的类withStyles 和 HOC 的使用遵循这一点: 有没有办法使用 makeStyles (我喜欢
我尝试将 Material UI Dashboard 转换为 TypeScript。 https://github.com/mui-org/material-ui/blob/master/docs/s
从 v3.9.x 升级到 MUI v4.0.2 后,我收到以下错误: You must pass a component to the function returned by connect. In
我是一名优秀的程序员,十分优秀!