这是我第一次进行前端测试。在这个项目中,我使用 Jest 快照测试,但TypeError: window.matchMedia is not a function在组件内部出现了错误。
我浏览了 Jest 文档,找到了“手动模拟”部分,但我还不知道如何做到这一点。
使用 Jest 进行测试时,您可能会遇到与组件是否依赖它相关的错误。这是因为 Jest 在 Node 环境中运行,默认情况下window.matchMedia该环境没有实现。window.matchMedia
window.matchMedia
要解决此问题,您可以window.matchMedia在测试设置文件中进行模拟。操作方法如下:
jest.setup.js
jest.config.js
package.json
在您的项目中创建一个新文件,例如jest.setup.js。
如果您使用jest.config.js文件,请添加以下内容:
// jest.config.js module.exports = { setupFiles: ['./jest.setup.js'], // other configuration options };
如果您通过 配置 Jest package.json,请添加以下内容:
// package.json { "jest": { "setupFiles": ["./jest.setup.js"], // other configuration options } }
添加模拟window.matchMedia实现jest.setup.js:
// jest.setup.js global.window.matchMedia = global.window.matchMedia || function() { return { matches: false, addListener: function() {}, removeListener: function() {} }; };
matchMedia
下面是一个使用 React 组件的示例matchMedia:
import React from 'react'; class MyComponent extends React.Component { componentDidMount() { if (window.matchMedia('(min-width: 600px)').matches) { console.log('Viewport is at least 600 pixels wide'); } else { console.log('Viewport is less than 600 pixels wide'); } } render() { return <div>My Component</div>; } } export default MyComponent;
以下是使用 Jest 为该组件编写快照测试的方法:
import React from 'react'; import renderer from 'react-test-renderer'; import MyComponent from './MyComponent'; test('MyComponent renders correctly', () => { const tree = renderer.create(<MyComponent />).toJSON(); expect(tree).toMatchSnapshot(); });
现在,当您运行 Jest 测试时,该window.matchMedia函数将被模拟,您不会再遇到TypeError: window.matchMedia is not a function错误。
TypeError: window.matchMedia is not a function
npm test
此设置可确保您的测试可以在 Node 环境中运行,而不会因缺少而失败window.matchMedia。