Jest已检测到以下1个打开的句柄,有可能阻止Jest退出

时间:2018-10-08 11:23:43

标签: javascript express testing jestjs

这是我的HTTP路由

 app.get('/', (req, res) => {
    res.status(200).send('Hello World!')
})

app.post('/sample', (req, res) => {
    res.status(200).json({
        x:1,y:2
    });
})

我想测试以下内容

1)GET要求工作正常。

2)/sample响应包含属性以及xy

const request = require('supertest');
const app = require('../app');

describe('Test the root path', () => {
    test('It should response the GET method', () => {
        return request(app).get('/').expect(200);
    });
})

describe('Test the post path', () => {
    test('It should response the POST method', (done) => {
        return request(app).post('/sample').expect(200).end(err,data=>{
            expect(data.body.x).toEqual('1');

        });
    });
})

但是在运行测试时出现以下错误

  

Jest检测到以下1个打开的句柄可能会保持Jest   退出:

     

返回请求(app).get('/')。expect(200);

4 个答案:

答案 0 :(得分:2)

这个技巧奏效了;

afterAll(async () => {
    await new Promise(resolve => setTimeout(() => resolve(), 500)); // avoid jest open handle error
});

如本github issue中所述。

答案 1 :(得分:0)

您需要使用done()方法调用end()

const request = require("supertest");
const app = require("../app");

let server = request(app);

it("should return 404", done =>
    server
        .get("/")
        .expect(404)
        .end(done);
});

答案 2 :(得分:0)

作为调试此错误的一般提示,将 --detectOpenHandles 添加到运行 Jest 的 npm 脚本中,例如

   "scripts": {
    ...
    "test": "jest --detectOpenHandles"
    }

这应该会告诉您到底是代码的哪一部分导致了问题(可能是某种类型的服务器连接,特别是如果它的 async)。

通常,如果您可以将连接代码移动到测试之外的文件中的单独函数,然后在测试中导入并调用它,这也将解决问题。

答案 3 :(得分:-1)

嗨,您也可以使用toEqual函数

describe('Test the post path', () => {
    test('It should response the POST method', () => {
        return request(app).post('/sample').expect(200).toEqual({ x:1,y:2
        });
    });
})

可以使用许多方法来代替。您可以扔掉涉及每个笑话功能https://jestjs.io/docs/en/expect

的官方文档。