问题描述
我正在用 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。这种方法的性能不如我想要的,但可以完成工作。