如何使用 cls 挂钩的非托管事务?

问题描述

我正在用 jest 和 sequelize 编写测试,我需要为每个测试保持我的数据库干净,所以我想为每个测试设置一个事务,然后在最后回滚。

这是我得到的,但它不会将交易传递给我的测试:

beforeEach(async () => {
  this.transaction = await db.sequelize.transaction();
});

test('Database should be clean',async () => {
  const role = await db.role.create({
    name: 'someName',});
  expect(role.id).toBe(1);
});

afterEach(async () => {
  await this.transaction.rollback();
});

Sequelize 已经设置为使用 cls

const Sequelize = require('sequelize');
const config = require('../../config/config.js');
const cls = require('cls-hooked');

const namespace = cls.createNamespace('testing-namespace');
Sequelize.useCLS(namespace);
const sequelize = new Sequelize(config);
...

如果有人能解释我如何使用带有 cls-hooked 的非托管事务,那将会非常有帮助。

解决方法

通过使用 umzug 以编程方式运行种子,我设法保持我的数据库干净,这是我的代码:

const { db } = require('../models');
const Umzug = require('umzug');
const path = require('path');

const umzug = new Umzug({
  migrations: {
    path: path.join(__dirname,'./../../seeders'),params: [db.sequelize.getQueryInterface()],},logging: false,});

beforeEach(async () => {
  const reverted = await umzug.down({ to: 0 });
  const executed = await umzug.up();
});

我尝试使用 umzug v3(测试版),但没有用,所以我使用了 stable version 2。这种方法的性能不如我想要的,但可以完成工作。