为什么 jest 运行 我的 Typescript 测试了两次并且总是失败一次?

Why is jest running my Typescript test twice and always failing once?

我正在后端编写一个测试来测试 API 的简单路由。我正在使用 Typescript 和 Jest 编写测试,这一切都发生在 docker 容器内,我首先使用 docker-compose.

我有一个帮助程序 class 用于我的测试,它通过 init 函数创建一个快速网络服务器的实例和一个数据库连接。在关闭功能中,它关闭连接等。 所以我的测试看起来像这样:

import { Helper } from "./helper";
import request from 'supertest'

describe('article', () => {
    const helper = new Helper();
    beforeAll(async () => {
        await helper.init();
    });

    afterAll(async () => {
        await helper.shutdown();
    });

    it('should test if reaching the api is possible', async (done) => {
        request(helper.app)
        .get('/test')
        .send()
        .set('Accept', 'application/json')
        .expect(200)
        .end( (error, response) => {
            if(error) throw error;
            expect(response.body.message).toBe("Hello");
        });
    });

为了执行测试,我使用这个脚本"test": "jest --verbose --forceExit --runInBand --detectOpenHandles"

如果我这样执行测试,我会得到以下输出:

我按照建议更改了超时,但没有任何区别。 现在出于测试目的,我将路线 return 设置为“Hello”,而不是预期的“Hello”。 这是我收到的输出:

所以它显然得到了回应。我的问题是,为什么 运行 测试两次,为什么总是在第二次测试时超时?[​​=18=]

这是我的jest.config.js

module.exports = {
    "roots": [
      "<rootDir>/src"
    ],
    "transform": {
      "^.+\.tsx?$": "ts-jest"
    },
    "testRegex": "(/__tests__/.*|(\.|/)(test|spec))\.tsx?$",
    "moduleFileExtensions": [
      "ts",
      "js"
    ],
  }

使用异步测试时,您可以从异步处理程序的主体中调用 done callback

应该这样做:

it('should test if reaching the api is possible', (done) => { // << async tests have the done callback declared here
        request(helper.app)
        .get('/test')
        .send()
        .set('Accept', 'application/json')
        .expect(200)
        .end( (error, response) => {
            if(error) {
              done(error);
            } else {
              expect(response.body.message).toBe("Hello");
              done();
            }
        });
    });

解决方案

由于最近这个问题引起了一些关注,所以我从问题文本中删除了解决方案并将其添加到这个答案中。 我不确定这 is/was 是否是正确的方法以及我是否做了一些多余的事情,因为我第二次使用 jest 并且从那以后就没有碰过它。但在我发布问题时,这解决了我的问题:

我不得不用 try-catch 块包围预期,不要将测试标记为异步,而是将完成函数传入并在预期之后和 catch 块中调用完成函数。