【发布时间】:2021-12-03 02:57:23
【问题描述】:
我正在为我的代码编写单元测试,并希望使用transactions 来防止测试之间出现任何杂散数据。
代码使用Sequelize ORM 进行与数据库的所有交互。由于更改实际代码不是一种选择,我将使用cls-hooked 来维护事务上下文,而不是将事务传递给所有查询。然而,有一个问题。在阅读官方文档并尝试进行操作时,上述方法似乎仅适用于托管事务。
到目前为止,测试代码看起来有点像:
test("Test decription", async () => {
try {
await sequelize.transaction(async (t) => {
//Actual test code
});
} catch (error) {
//Do nothing if query rolled back
}
});
我打算实现的目标(原因很明显):
let t;
beforeEach(async () => {
t = await sequelize.transaction();
});
test("Test decription", async () => {
//Actual test code
});
afterEach(async () => {
await t.rollback();
});
这可能吗?如果是,我们将不胜感激。
【问题讨论】:
-
明显的原因 - 什么原因?第一个 sn-p 到底有什么问题?
-
@EstusFlask 对于每个测试,第一种方法需要启动一个事务并向测试本身添加一个 catch 块。第二种方法将导致更清晰的测试代码和更容易处理以及避免代码冗余。
-
不久前看到一个类似的 CLS 问题,但找不到。我想解决方案就是这里讨论的,github.com/Jeff-Lewis/cls-hooked/issues/44。
标签: mysql node.js jestjs sequelize.js cls-hooked