开玩笑测试失败:TypeError:window.matchMedia 不是函数

新手上路,请多包涵

这是我的第一次前端测试经验。在这个项目中,我使用 Jest 快照测试并在我的组件中收到错误 TypeError: window.matchMedia is not a function

我浏览了 Jest 文档,找到了“手动模拟”部分,但我还不知道如何做到这一点。

原文由 TIJ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 903
2 个回答

Jest 文档现在有一个“官方”解决方法:

 Object.defineProperty(window, 'matchMedia', {
  writable: true,
  value: jest.fn().mockImplementation(query => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: jest.fn(), // Deprecated
    removeListener: jest.fn(), // Deprecated
    addEventListener: jest.fn(),
    removeEventListener: jest.fn(),
    dispatchEvent: jest.fn(),
  })),
});

未在 JSDOM 中实现的模拟方法

原文由 Selrond 发布,翻译遵循 CC BY-SA 4.0 许可协议

我一直在使用这种技术来解决一堆模拟问题。

 describe("Test", () => {
  beforeAll(() => {
    Object.defineProperty(window, "matchMedia", {
      writable: true,
      value: jest.fn().mockImplementation(query => ({
        matches: false,
        media: query,
        onchange: null,
        addListener: jest.fn(), // Deprecated
        removeListener: jest.fn(), // Deprecated
        addEventListener: jest.fn(),
        removeEventListener: jest.fn(),
        dispatchEvent: jest.fn(),
      }))
    });
  });
});

或者,如果你想一直模拟它,你可以放入你的 mocks 从你的 package.json 调用的文件: "setupFilesAfterEnv": "<rootDir>/src/tests/mocks.js",

参考: setupTestFrameworkScriptFile

原文由 Maxime Beauchamp 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进