Cypress 13推送AWS EventBridge事件遇Cucumber预处理器错误
适配Cypress 13 + Cucumber的AWS EventBridge事件推送方案
1. 修正Cucumber步骤函数(核心问题)
确保你的Cucumber步骤函数不要使用async/await,直接调用cy.task即可——Cypress命令本身是异步队列化的,不需要手动await。
错误写法(会返回原生Promise,触发报错):
Given('我推送交易事件到EventBridge', async () => { await cy.task('seedTx', transactionData); });
正确写法:
Given('我推送交易事件到EventBridge', () => { cy.task('seedTx', transactionData); });
2. 调整Task处理逻辑(两种可选方式)
方式一:改用回调式处理(彻底避免Promise返回)
修改eventBridge.ts中的insertTxEvents函数,使用Cypress Task支持的回调参数来完成异步通知:
import { EventBridgeClient, PutEventsCommand } from "@aws-sdk/client-eventbridge"; export function insertTxEvents(data: any, done: (error?: Error) => void) { const eventBridgeClient = new EventBridgeClient({ region: "你的AWS区域" }); const putEventsCommand = new PutEventsCommand({ Entries: [ { Source: "你的事件源", DetailType: "交易事件", Detail: JSON.stringify(data), EventBusName: "你的事件总线名称" } ] }); eventBridgeClient.send(putEventsCommand) .then(() => done()) // 任务成功,调用done无参数 .catch((err) => done(err)); // 任务失败,传递错误给done }
然后在cypress.config.ts中配置Task时,传入done回调:
import { defineConfig } from "cypress"; import { insertTxEvents } from "./path/to/eventBridge"; export default defineConfig({ e2e: { setupNodeEvents(on, config) { on("task", { seedTx: (data, done) => { insertTxEvents(data, done); } }); }, // 其他Cucumber相关配置 specPattern: "cypress/e2e/**/*.feature", supportFile: "cypress/support/e2e.ts" } });
方式二:保留async/await但确保Task返回Cypress兼容的Promise
如果不想改回调,可以保留insertTxEvents的async写法,但确保Task直接返回这个Promise(Cypress 13的Task本身支持async函数),同时必须保证步骤函数不是async的:
eventBridge.ts代码不变:
import { EventBridgeClient, PutEventsCommand } from "@aws-sdk/client-eventbridge"; export async function insertTxEvents(data: any) { const eventBridgeClient = new EventBridgeClient({ region: "你的AWS区域" }); const putEventsCommand = new PutEventsCommand({ Entries: [ { Source: "你的事件源", DetailType: "交易事件", Detail: JSON.stringify(data), EventBusName: "你的事件总线名称" } ] }); await eventBridgeClient.send(putEventsCommand); }
cypress.config.ts配置:
import { defineConfig } from "cypress"; import { insertTxEvents } from "./path/to/eventBridge"; export default defineConfig({ e2e: { setupNodeEvents(on, config) { on("task", { seedTx: insertTxEvents // 直接传入async函数,Cypress会处理Promise }); }, // 其他Cucumber配置 } });
3. 验证方案
运行测试时,Cucumber预处理器不会再检测到原生Promise返回,同时AWS EventBridge的事件推送逻辑正常执行。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

