Jest 测试移动端 React 组件时如何模拟 useMediaQuery?
我写了个响应式组件,用 useMediaQuery 判断是不是移动端,但在 Jest 里跑测试一直报错说 matchMedia 未定义。试过 mock window.matchMedia,但还是不生效,到底该怎么正确模拟啊?
这是我的组件代码:
import { useState, useEffect } from 'react';
function useMediaQuery(query) {
const [matches, setMatches] = useState(false);
useEffect(() => {
const media = window.matchMedia(query);
if (media.matches !== matches) setMatches(media.matches);
const listener = () => setMatches(media.matches);
media.addEventListener('change', listener);
return () => media.removeEventListener('change', listener);
}, [matches, query]);
return matches;
}
export default function MyComponent() {
const isMobile = useMediaQuery('(max-width: 768px)');
return isMobile ? <div>Mobile</div> : <div>Desktop</div>;
}
在你的测试文件开头加上这段代码:
然后在具体测试用例里根据需要设置 matches 的返回值。比如要模拟移动端环境时:
记得要把 matches 设置为 true 来模拟移动端环境,不然默认是 false 哦。这招帮我解决了不少问题,希望也能帮到你。
记得根据你的测试需求修改 matches 返回值。这样就能正常跑测试了。