You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:42:11