【问题标题】:Jest cleanup after test case failed测试用例失败后的笑话清理
【发布时间】: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


【解决方案1】:

在这种情况下使用 try/finally 块。

例如:

  it("some test case", async done => {
    try {
      expect(false).toEqual(true);
      console.log("abc");
      done();
    }finally{
      console.log("finally");
      // cleanup code below...
    }
  });

上面的代码只会执行 finally 块(因此“finally”会打印在控制台中,而不是“abc”。 请注意,catch 块会给出超时,因此只需使用 finally。

This的回答一定很有用。

【讨论】:

    【解决方案2】:

    如果你使用 afterEach() 会怎样?每次测试后都会执行

    test('some test', async () => {
      const { sheetService, cleanup } = await makeUniqueTestSheetService();
    
      // do tests with expect()
    
    });
    
    afterEach(async()=>{
        await cleanup();
    });
    

    【讨论】:

    • afterEach 非常适合清理在每次测试之前创建的项目。如果您在一个测试中创建特定对象,并希望在 那个 测试结束时清理 那些 怎么办?
    • 可能不是一个好习惯。但是您可以使用 if 语句来检查 afterEach 中的测试方法名称。
    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 2010-11-11
    • 2018-03-29
    • 1970-01-01
    • 2021-09-13
    • 2020-07-12
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多