Cypress setupNodeEvents中cy.task返回对象丢失函数属性问题
Cypress任务返回对象丢失函数属性的原因
我编写了一个Node函数,该函数返回带有函数属性的对象字面量。当我通过Cypress的setupNodeEvents配置任务调用此函数,并在Cypress测试中使用时,返回的对象不再包含该函数属性,其值变为undefined。请问该函数属性丢失的原因是什么?
Node函数代码
module.exports = build = () => { return { myFunc() {} }; }
Cypress配置文件
const build = require('./builder'); module.exports = defineConfig({ env, e2e: { setupNodeEvents(on, config) { on('task', { buildObject: () => build(); }) }, }, })
Cypress测试文件
describe('transform', () => { it('should return object with a function property', () => { cy.task('buildObject') .then(result => assert.isFunction(result.myFunc)); }); });
我预期result.myFunc已定义且为Function类型,但实际结果显示“expected undefined to be a function”。
原因分析
核心原因是Cypress任务的返回值会被自动序列化为JSON,而JSON规范不支持序列化函数类型。
当Node端执行buildObject任务返回包含函数的对象时,Cypress会将该对象转换为JSON格式,用于在Node进程和浏览器进程之间传递数据。由于JSON没有函数类型的定义,序列化过程中所有函数属性都会被直接忽略,因此浏览器端的测试代码拿到的结果里,myFunc属性就变成了undefined。
解决方案
如果需要在测试中使用相关逻辑,有两种可行方向:
- 将函数逻辑直接编写在测试代码(浏览器端)中,避免跨进程传递函数
- 若必须在Node端处理后传递,可以把函数转换为字符串形式,在测试端通过
new Function()还原,但这种方式要注意代码注入的安全风险
内容的提问来源于stack exchange,提问作者bobo
相关产品推荐
相关产品推荐

