在事务中包装续集 ORM 测试

col*_*r-j 5 javascript sequelize.js jestjs

我正在寻找一种方法来使我的测试用例使用sequelize ORM 事务性。这已经在sequelize github issues上进行了讨论:

寻找一种方法来执行以下操作:

describe('My test case', () => {
    beforeEach(() => {
        ... create a transaction
    })

    afterEach(() => {
        ... roll back the transaction
    })

    ..... RUN isolated tests

})
Run Code Online (Sandbox Code Playgroud)

我习惯了 Django ORM,它在测试用例中默认执行此操作(其中包括自动管理迁移)。

Rom*_*ian 0

本文中有一个使用 Jest 和 Sequelize 的示例。

通过您的代码示例,您可以执行以下操作:

import { sequelize } from './connection'

describe('My test case', async () => {
  let transaction;

  beforeEach(() => {
    const cls = new Map();
    Object.defineProperty(cls, 'run', {
      value: fn => {
        fn(this);
        return this;
      },
    });
    transaction = await sequelize.transaction();
    sequelize.constructor._cls = cls;
    sequelize.constructor._cls.set('transaction', transaction);
  })

  afterEach(async () => {
    await transaction.rollback();
  })
  
  // ..... RUN isolated tests

})
Run Code Online (Sandbox Code Playgroud)

当然,您可以将beforeEachafterEach代码放在一个函数中,并在测试文件中调用该函数以避免重复。