使用MikroORM与Jest的toMatchObject匹配器时报错及POJO转换问题
MikroORM实体结合Jest测试的问题解决
问题1:直接匹配实体抛出Cannot redefine property: __helper错误
当在Jest中直接用toMatchObject断言MikroORM实体时,会触发以下错误:
Cannot redefine property: __helper TypeError: Cannot redefine property: __helper
这是因为MikroORM实体的代理对象包含不可重定义的内部元数据属性__helper,Jest的断言方法遍历属性时触发了报错。
解决方式
- 手动转换实体为普通对象:提取需要断言的属性,规避内部元数据:
const ads = await repo.findAll({ orderBy: { providerId: 'asc' } }); const plainAds = ads.map(ad => ({ providerId: ad.providerId, title: ad.title, createdBy: { id: ad.createdBy.id }, updatedBy: { id: ad.updatedBy.id }, removed: ad.removed })); expect(plainAds).toMatchObject([ { providerId: 'a', title: 'a-changed', createdBy: { id: firstJobId }, updatedBy: { id: secondJobId }, removed: false } ]);
- 使用
expect.objectContaining匹配部分属性:避免遍历整个实体对象:
const ads = await repo.findAll({ orderBy: { providerId: 'asc' } }); expect(ads[0]).toEqual(expect.objectContaining({ providerId: 'a', title: 'a-changed', removed: false, createdBy: expect.objectContaining({ id: firstJobId }), updatedBy: expect.objectContaining({ id: secondJobId }) }));
问题2:wrap(entity).toPOJO()转换后关联实体变为ID而非对象
toPOJO()默认仅保留实体的标量属性和外键ID,不会保留已加载的关联对象结构。
解决方式
查询时通过populate加载关联字段,再使用wrap(entity).toJSON()转换(toJSON()会保留已加载的关联对象):
// 查询时指定加载关联字段 const ads = await repo.findAll({ orderBy: { providerId: 'asc' }, populate: ['createdBy', 'updatedBy'] }); // 用toJSON()转换实体,保留关联对象结构 const plainAds = ads.map(ad => wrap(ad).toJSON()); expect(plainAds).toMatchObject([ { providerId: 'a', title: 'a-changed', createdBy: { id: firstJobId }, updatedBy: { id: secondJobId }, removed: false } ]);
内容的提问来源于stack exchange,提问作者ps-aux
相关产品推荐
相关产品推荐

