为什么 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 块中调用完成函数。
我正在后端编写一个测试来测试 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 块中调用完成函数。