微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Sequelize:同一表中的多个实体破坏测试

如何解决Sequelize:同一表中的多个实体破坏测试

我继承了一个项目,其中 2 个 sequelize 实体存储在同一个表中。 所以它们都有相同的 tableNameschema

@Table({ tableName: 'thesaMetable',schema: 'schema',timestamps: false })
export default class FooModel extends Model<FooModel> {
  fieldA: string
}

@Table({ tableName: 'thesaMetable',timestamps: false })
export default class BarModel extends Model<BarModel> {
  fieldB: string
}

代码实际上运行良好,但是当我为此代码编写测试时,我使用了内存中的 sql

dbConnection = new Sequelize('sqlite::memory:',{
  models,logging: false,});
await dbConnection.sync({ force: true,logging: true });

jest.spyOn(FooModel,'schema').mockImplementation(() => FooModel);
jest.spyOn(BarModel,'schema').mockImplementation(() => BarModel);

到目前为止一切都很好,但是当第一条记录插入表中时,会弹出错误

DatabaseError [SequelizeDatabaseError]: sqlITE_ERROR: no such column: fieldB

检查日志文件后,我发现它只创建了一次表,而当它创建时,它只创建了第一个实体的字段。因此,当为第二个实体插入数据时,字段自然会丢失。

有没有办法告诉 sequelize/MysqL 在创建表时有效地包含两个实体的字段。

我尝试了很多不同的设置。

  • 我尝试将 force: true 更改为 alter: true
  • 我尝试使用 define: { freezeTableNames: true }
  • 我尝试添加 dialect: 'MysqL'
  • 我尝试了以下设置:paranoid: true

因为它只会影响测试,而且表中实际上有很多生产数据,所以我更愿意将更改表名作为最后的选择。

编辑:

一段时间后,我意识到即使这在生产中运行良好。代码作为 2 个微服务运行,每个微服务仅使用 1 个实体。因此,虽然有 2 个实体使用同一张表,但他们并不知道彼此的存在。然而,我的测试尝试使用所有模型。

解决方法

所以你有两个同名的表?我相信 sync() 方法将只创建其中之一。除非您运行生产迁移进行测试,否则我认为同步不会允许您拥有两个同名的表。

,

虽然有多个模型引用同一个表,但我花了一些时间才意识到它们用于不同的微服务。因此,实际上它们从未一起使用。这就解释了为什么在生产中没有问题。

我运行的测试也只需要访问一组有限的模型。 实际上可以明确说明它需要的那些。

dbConnection = new Sequelize('sqlite::memory:',{
  models: [FooModel],logging: false,});

这解决了所有问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。