使用 express 完成测试运行后一秒钟 Jest 没有退出

Posted

技术标签:

【中文标题】使用 express 完成测试运行后一秒钟 Jest 没有退出【英文标题】:Jest did not exit one second after the test run has completed using express 【发布时间】:2019-05-24 21:30:59 【问题描述】:

我正在使用 JEST 对我的快速路线进行单元测试。

在运行 yarn test 时,我所有的测试用例都通过了,但我遇到了一个错误

Jest did not exit one second after the test run has completed.

This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with `--detectOpenHandles` to troubleshoot this issue.

我使用了async & done,但仍然抛出上述错误。

以下是我的规范代码。请帮忙

routes.spec.ts

const request = require('supertest');
describe('Test the root path', () => 
  const app = require('./index');

  test('GET /gql/gql-communication-portal/release-notes', async (done) => 
    const response = await request(app).get('/gql/gql-communication-portal/release-notes');
    expect(response.status).toBe(200);
    done();
  );
);

【问题讨论】:

app = require('./index') 这会启动服务器侦听端口吗?理想情况下,应该设置您的服务器,以便无需实际启动它就可以导入它,这就是您在这种情况下想要做的。它也可能解决您的问题。 一定要记得看“问”的日期.. 【参考方案1】:

这段代码解决了我的问题:

beforeAll(done => 
  done()
)

afterAll(done => 
  // Closing the DB connection allows Jest to exit successfully.
  mongoose.connection.close()
  done()
)

【讨论】:

我也遇到了同样的问题,只是 mysql 的问题。我关闭了与mysql的连接,它可以工作。谢谢 这个答案必须被接受。 添加 done() 解决了我的问题。谢谢【参考方案2】:

我遇到了同样的问题,但在我的 package.json 文件中我添加了"test": "jest --detectOpenHandles" 并运行了npm test --detectOpenHandles。这次我没有收到错误信息。也许你可以尝试这样做。

【讨论】:

我猜是--runInBand,which is set with --detectOpenHandles implicitly,解决了这种情况下的问题。 这应该是检测导致问题的原因而不是解决问题的建议。 这只是抑制错误消息,因为它打开了诊断功能 - 它无法解决错误,并且不允许测试成功退出。【参考方案3】:

就我而言,我只是将app.listen() 与我的应用程序分开。 因此,使用 express,您的应用会以导出结束。

// index.js
module.exports = app;

然后创建另一个文件来监听端口。

// server.js
const app = require('./index')
app.listen(...)

如果您在测试中只导入索引 (app index.js),它应该可以在没有额外配置的情况下工作。 当然你需要调整你的快递应用程序的启动。现在应该使用server.js

【讨论】:

谢谢!你知道为什么将 app.listen 移到文件之外吗? 对我来说就是这样,谢谢。我正在使用来自 supertest 的请求功能,它不需要服务器运行,所以我将 app.listen 与它分开。这里还有一个完整的示例供未来读者使用:tutorialedge.net/typescript/…【参考方案4】:

对我来说,这是一个不同的问题,我使用 supertest 来测试路由本身,所以我不得不关闭与服务器本身的连接。

afterAll(done => 
    server.close();
    done();
);

如果您不是这种情况,this issue 可能会为您提供一些帮助

【讨论】:

【参考方案5】:

这对我有用

const mongoose = require('mongoose');
    afterAll(async(done) => 
  // Closing the DB connection allows Jest to exit successfully.
  try 
    await mongoose.connection.close();
    done()
   catch (error) 
    console.log(error);
    done()
  
  // done()
)

【讨论】:

【参考方案6】:

添加

jest.useFakeTimers();

在测试套件的开头为我修复了它。

可能来自渲染组件部分中定义的计时器(如节流按钮、模拟等)。

【讨论】:

【参考方案7】:

我已将此行添加到 package.json

它对我有用

jest --runInBand --detectOpenHandles --forceExit

【讨论】:

【参考方案8】:

对于 Firebase,我必须调用 cleanup()

import 
    assertFails,
    assertSucceeds,
    initializeTestEnvironment,
    RulesTestEnvironment,
 from "@firebase/rules-unit-testing";
import  doc, setDoc  from "firebase/firestore";

it('creates a new user document in firebase', async () => 
    const testEnv = await initializeTestEnvironment(
        projectId: "appname-test",
        firestore: 
            host: 'localhost',
            port: 8088
        
    );

    const alice = testEnv.authenticatedContext("alice");

    await assertSucceeds(setDoc(doc(alice.firestore(), "users", "alice"), 
        fname: "Alice",
        lname: "Wonderland",
        dob: "18/01/1999",
        email: "alice@example.com"
    ));

    return await testEnv.cleanup();
);

【讨论】:

以上是关于使用 express 完成测试运行后一秒钟 Jest 没有退出的主要内容,如果未能解决你的问题,请参考以下文章

测试运行完成后一秒钟 Jest 没有退出(没有猫鼬)

Spark 在启动后一分钟失去所有执行者

zosftplib submit_wait_job(jcl) 函数不接收 JES 输出

使用 IEFs-s-rEQ 宏的 MVS JES2 清除作业

PyQt5 窗口在运行几秒钟后自动关闭 - “进程以退出代码 -1073741819 (0xC0000005) 完成”

React Jest 测试无法使用 ts-jest 运行 - 导入文件上出现意外令牌