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
相关产品推荐
相关产品推荐

