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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:05:42