【发布时间】:2019-07-06 00:55:32
【问题描述】:
测试用例失败后有什么好的干净的清理方法? 对于很多测试用例,我首先创建了一个干净的数据库环境,需要在一个测试用例完成后进行清理。
test('some test', async () => {
const { sheetService, cleanup } = await makeUniqueTestSheetService();
// do tests with expect()
await cleanup();
});
问题是:如果expects 之一失败,则不会调用cleanup(),因此不会清理数据库环境并开玩笑抱怨Jest did not exit one second after the test run has completed.,因为连接未关闭。
我当前的解决方法看起来像这样,但是将清理挂钩推送到一个数组而不是afterAll 事件中处理的数组感觉并不好和干净。
const cleanUpHooks: (() => Promise<void>)[] = [];
afterAll(async () => {
await Promise.all(cleanUpHooks.map(hook => hook()));
});
test('some test', async () => {
const { sheetService, cleanup } = await makeUniqueTestSheetService();
// do tests with expect()
await cleanup();
});
【问题讨论】:
-
如果您使用 mongo 作为数据库npmjs.com/package/mongo-clean,这可能会起作用。
-
我通常在
afterEach执行单元测试时删除和恢复数据库,因为我希望它们被隔离,也能够并行运行它们以减少在该过程中花费的时间。如果您不需要那种级别的隔离,在afterAll执行中恢复数据库从我的角度来看似乎足够干净。 -
@Dez 如何从
afterEach访问在测试用例中创建的资源?在我的情况下,它将是数据库连接。 -
最好和最安全的方法是分别为每个测试启动 DB。这为您提供了 100% 的隔离。
-
@MU 这正是我目前正在做的事情。问题是,即使测试用例失败,我如何才能安全地清理数据库和连接(这就是
cleanup函数所做的);)
标签: javascript typescript testing jestjs