Jest + Material-UI:正确模拟 useMediaQuery

2023-11-25

我正在使用 Material-UIuseMediaQuery()我的组件之一中的函数来确定size用于 a 的道具<Button>在组件内。

我正在尝试测试它在玩笑测试中是否按预期工作,但是我当前的实现不起作用:

describe("Unit: <Navbar> On xs screens", () => {

  // Incorrectly returns `matches` as `false` ****************************
  window.matchMedia = jest.fn().mockImplementation(
    query => {
      return {
        matches: true,
        media: query,
        onchange: null,
        addListener: jest.fn(),
        removeListener: jest.fn()
      };
    }
  );

  it("renders as snapshot", async () => {
    const width = theme.breakpoints.values.sm - 1;
    const height = Math.round((width * 9) / 16);
    Object.defineProperty(window, "innerWidth", {
      writable: true,
      configurable: true,
      value: width
    });
    const { asFragment } = render(
      <Container backgroundColor={"#ffffff"}>
        <Navbar />
      </Container>
    );
    expect(asFragment()).toMatchSnapshot();
    const screenshot = await generateImage({
      viewport: { width, height }
    });
    expect(screenshot).toMatchImageSnapshot();
  });
});

describe("Unit: <Navbar> On md and up screens", () => {

  // Correctly returns `matches` as `false` ****************************
  window.matchMedia = jest.fn().mockImplementation(
    query => {
      return {
        matches: false,
        media: query,
        onchange: null,
        addListener: jest.fn(),
        removeListener: jest.fn()
      };
    }
  );

  it("renders as snapshot", async () => {
    const width = theme.breakpoints.values.md;
    const height = Math.round((width * 9) / 16);
    Object.defineProperty(window, "innerWidth", {
      writable: true,
      configurable: true,
      value: width
    });
    const { asFragment } = render(
      <Container backgroundColor={"#ffffff"}>
        <Navbar />
      </Container>
    );
    expect(asFragment()).toMatchSnapshot();
    const screenshot = await generateImage({
      viewport: { width, height }
    });
    expect(screenshot).toMatchImageSnapshot();
  });
});

我正在测试的组件(删除了不相关的部分):

const Navbar = () => {
  const theme = useTheme();
  const matchXs = useMediaQuery(theme.breakpoints.down("xs"));
  return (
    <Button size={matchXs ? "medium" : "large"}>
      Login
    </Button>
  );
};
export default Navbar;

正在回归matches as false对于第一个测试,即使我已将其设置为返回 true。我知道这一点是因为它正在生成屏幕截图,并且我可以看到按钮大小设置为large对于第一次测试,应将其设置为medium.

它在生产中按预期工作。

我如何正确地进行模拟useMediaQuery()在玩笑测试中?


推荐的方法是使用css-mediaquery现在提到的MUI 文档:

import mediaQuery from 'css-mediaquery';

function createMatchMedia(width) {
  return query => ({
    matches: mediaQuery.match(query, { width }),
    addListener: () => {},
    removeListener: () => {},
  });
}

describe('MyTests', () => {
  beforeAll(() => {
    window.matchMedia = createMatchMedia(window.innerWidth);
  });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jest + Material-UI:正确模拟 useMediaQuery 的相关文章

随机推荐

  • 如何对 SQL 中存储的附近纬度和经度位置进行分组

    我正在尝试分析英国自行车事故的数据 以找到统计黑点 这是另一个网站的数据示例 http www cycleinjury co uk map 我目前正在使用 SQLite 来存储大约 100k 的纬度 经度位置 我想将附近的位置分组在一起 这
  • .net 3.5 中的 string.Join()

    我在 vs2008 中有一个 net 3 5 项目 我正在尝试使用这种超载 of string Join 需要一个string and IEnumerable
  • .NET Core 3.1 Worker Service - 环境特定配置

    我正在尝试使用 VS 2019 Enterprise 提供的 asp net core 3 1 模板设置工作人员服务 迄今为止 1 创建一个新项目并运行它 托管环境 开发 按预期工作 发展 2 创建了FileSystem发布配置文件 并添加
  • 当名称不包含某些单词时删除文件

    我正在使用 Linux 并打算使用 shell 删除一些文件 我的文件夹中有一些文件 一些文件名包含 好 一词 另一些则不包含 例如 ssgood wmv ssbad wmv goodboy wmv cuteboy wmv 我想删除名称中不
  • 我们如何以编程方式获取 UIImageView 的坐标?

    我想以编程方式获取 UIImageView 的坐标 我该怎么做呢 例如我有一个正方形 我想获得所有角点的坐标 我必须如何进行 NSLog f ImageView frame origin x NSLog f ImageView frame
  • 保存并检索选定的微调器位置

    您将如何保存和检索微调器选择 以便当您返回时会选择微调器上的相同项目 也许有共同的偏好 将数据保存在sharedPreferences 将此代码放在onItemSelected 方法并保存所选值的位置spinner int userChoi
  • 清单中的 Visual Studio 2005 安全更新和 CRT DLL 版本

    最近的 Visual Studio 2005 安全更新可能会给我们带来问题 我们构建并内部分发用 C 编写的 SDK 这些 SDK 仅是头文件和静态库的集合 安装安全更新后 我们的 SDK 现在依赖于较新版本的 MSVC CRT DLL 这
  • Oracle XE 停止工作。 TNS 侦听器拒绝连接

    我正在开发一个使用 Oracle XE 11g 作为其 RDBMS 的应用程序 它工作了几个星期 但现在我开始收到有关连接被拒绝的错误消息 我重新启动了系统 但没有帮助 我卸载了 XE 删除了所有剩余文件 甚至从注册表中 并重新安装了它 现
  • 流模式下的 AudioTrack MODE_STREAMING

    我需要流式传输运行时生成的 PCM 数据 所以我有一个带循环的线程 public void run while mAudioTrack write getPCM 不幸的是这不起作用 它似乎不依赖于 AudioTrack 缓冲区大小 我希望它
  • 子控制器未注入主控制器

    我有一个 BorderPane 与 MainController 关联 BorderPane 使用的 FXML
  • Android 上最低开销的相机到 CPU 到 GPU 的方法

    我的应用程序需要在 CPU 上对实时相机帧进行一些处理 然后再将它们渲染到 GPU 上 GPU 上还渲染了一些其他内容 这些内容取决于 CPU 处理的结果 因此 保持所有内容同步非常重要 这样我们就不会在 GPU 上渲染帧本身 直到 CPU
  • iOS 7 中的静默推送通知有速率限制吗?

    我看到一个关于静默推送通知限制的参考 静默推送受到速率限制 每小时少量 来自 WWDC 2013 http devstreaming apple com videos wwdc 2013 204xex2xvpdncz9kdb17lmfooh
  • 是否可以使用一个替换函数来替换一个字段中的多个字符串?

    在我的报告中 我需要使用内置替换函数将 a 替换为 b 将 c 替换为 d 当我只使用两个这样的函数时 替换 字段 field1 Value a b 替换 字段 field1 Value c d 我在报告中两次从现场获得文本 是否有可能做到
  • 使用 Google+ 登录时如何注销

    谷歌文档在那里gapi auth signOut 方法在这里 https developers google com web signin sign out 问题是它说你只能在之后调用该方法signinCallback已解雇 据我所知 唯一
  • 不同库中的相同符号和链接顺序

    我有 2 个库 test 1 and test 2 两个库都包含一个全局的外部 C void f 函数 具有不同的实现 只是cout用于测试 我做了以下测试 Test 1动态链接 如果我添加libtest 1 so进而libtest 2 s
  • 无法在 case 语句 bash 中设置变量

    我试图根据一堆输入条件设置一个变量 这是代码的一个小示例 bin bash INSTANCE SIZE case 1 in micro INSTANCE SIZE t1 micro small INSTANCE SIZE m1 small
  • 自动释放与释放

    当我需要一个数组临时使用时 这些有什么区别 1 NSMutableArray stuff NSMutableArray alloc init use the array stuff release 2 NSMutableArray stuf
  • 在 WooCommerce 购物车中获取购物车项目的产品 ID

    cart item woocommerce gt cart gt get cart 我有上面的代码 如果我在 cart item 上运行 print r 我会得到一个多维数组 Array a6292668b36ef412fa3c4102d1
  • Web应用中长时间运行查询问题的解决方案(异步请求)

    这是问题所在 企业 Web 应用程序的用户正在执行导致长 非常长 数据库查询 或其他长处理密集型任务 的任务 问题 请求超时 一段时间后用户可能会遇到请求超时 会话超时 如果未使用会话保持方法 则可能会发生会话超时 Request thre
  • Jest + Material-UI:正确模拟 useMediaQuery

    我正在使用 Material UIuseMediaQuery 我的组件之一中的函数来确定size用于 a 的道具