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

Typescript+Cypress测试场景下连续调用Faker生成重复数据问题

根因分析
  • 最核心的问题是克隆逻辑错误导致所有调用共享同一个对象:代码中的_.cloneDeep(program)没有接收返回值,克隆生成的新对象直接被丢弃,后续所有_.set赋值操作都是直接修改模块作用域下的公共program对象,最终返回的也是这个公共对象的引用。连续两次调用时,第二次的赋值会覆盖第一次的值,且program1和program2指向同一个内存地址,所以输出完全一致。
  • 次要因素为lockTime字段的生成逻辑:该字段用moment().format('LT')取当前时间的时分格式,连续调用间隔小于1分钟时该字段值会完全相同,但并非本次问题的核心原因。
解决方案

修改generateProgram的实现,每次调用都基于克隆结果生成独立的新对象,避免共享引用:

export const generateProgram = () => {
    // 将克隆结果赋值给本地变量,每次调用生成完全独立的对象
    const newProgram = _.cloneDeep(program);
    _.set(newProgram, 'name', faker.random.word());
    _.set(newProgram, 'email', faker.internet.email());
    _.set(newProgram, 'lockDate', moment(faker.date.future()).format('YYYYMMDD'));
    _.set(newProgram, 'lockTime', moment().format('LT'));
    return newProgram;
};

如果需要进一步避免faker生成重复值的极端情况,可以给随机字段加唯一后缀,比如:

_.set(newProgram, 'name', `${faker.random.word()}_${Date.now()}`);

修改后连续调用generateProgram会返回两个独立的、值不同的对象,测试用例即可正常执行。

内容的提问来源于stack exchange,提问作者Mona101ma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:54:04