PR提交时GitHub Actions报错,但本地测试正常?
我最近在项目里加了个GitHub Actions工作流,用来在PR时跑单元测试。奇怪的是,本地 npm test 完全通过,但一推到PR就失败,报错说某个组件的快照不匹配。我已经确认了Node和npm版本一致,也试过清除缓存重装依赖,还是不行。
是不是因为CI环境里某些全局配置不一样?或者快照生成路径有问题?下面是我那个组件的代码:
const WelcomeBanner = ({ user }) => {
return (
<div className="banner">
欢迎回来,{user?.name || '游客'}!
</div>
);
};
export default WelcomeBanner;
先说快速解决方案:运行
npm test -- -u更新快照,然后提交。但这只是临时绕过去,下次可能还会踩坑。要想根治,你得查一下项目中是否有其他地方用了日期格式化或者动态内容。Jest快照在CI环境下有时候会因为时区不同导致结果不一致,特别是如果你用了
new Date().toLocaleString()或者 moment.js 这类日期库。排查步骤:
1. 先在本地跑
npm test -- --coverage看看报错的组件到底是哪个,你给的这个 WelcomeBanner 看起来没有动态内容,问题可能在其他地方。2. 检查报错的快照文件里到底哪里不一致,很可能是时间戳或者格式化后的日期。
3. 如果确认是日期问题,在测试文件里mock掉Date:
4. 另一个可能:检查你的 jest.config.js 里 testEnvironment 配置,本地如果是 jsdom 但CI上可能默认了不同配置。
我之前那次是因为项目里有个地方用了
Intl.DateTimeFormat,CI服务器是UTC时区,本地是北京时间,导致格式化结果差了8小时。加上 mock 之后世界清净了。