Storybook中如何配置Jest快照测试时忽略特定样式属性?
我在给React组件写Storybook快照测试时遇到问题,快照里总是包含组件上不需要的样式属性,比如data-testid。我尝试在Jest配置里加了snapshotSerializers,但还是报错说快照不匹配,应该怎么排除这些属性呢?
具体场景是这样的:我用Storybook+Jest做快照测试,组件有data-testid="button"这样的测试辅助属性。执行测试时快照里会包含这个属性,但我想只保留组件的核心结构。之前试过修改jest.config.js:
module.exports = {
snapshotSerializers: ['@testing-library/react-native/serializer'],
// 其他配置...
};
但运行npm test时仍然得到这样的错误:
- Received value does not match stored snapshot.
- Diff:
@@ -10,10 +10,9 @@
"props": {
"children": "Click me",
"className": "primary-btn",
- "data-testid": "button",
"onClick": [Function]
},
...
有什么办法能全局配置快照测试忽略特定属性吗?或者需要在Storybook的预处理器里做处理?
标准写法是用
@storybook/testing-react提供的预处理器机制,在快照序列化前把不需要的属性过滤掉。你可以通过自定义一个 snapshot serializer 来实现全局过滤。在项目根目录新建一个文件,比如
jest-serializer-remove-test-ids.js:然后在
jest.config.js里注册这个 serializer:注意路径要写对,可以用
path.resolve引入。这样所有快照里的
data-testid都会被自动移除,不会再出现 diff 报错。而且这是全局生效的,不用每个 story 单独处理。另外提醒一点,别指望 Storybook 的 render 预处理能解决这个问题,因为快照是 Jest 拿到的 VDOM 结构,必须在序列化阶段动手脚才有效。这套方案是目前社区的标准做法,文档也明确推荐过类似模式。