代码之家  ›  专栏  ›  技术社区  ›  Tom Klino

测试结束后摩卡挂了

  •  5
  • Tom Klino  · 技术社区  · 6 年前

    我在nodejs中运行mocha,测试一个异步函数,我没有忘记调用done,但是测试通过后,mocha就挂在那里,什么都不等待。甚至是我为之设置的功能 after() 已经完成了,但是直到我按ctrl+c,摩卡才退出。

    代码如下:

    describe("tests the user_handler", () => {
      beforeEach(resetDB);
      after(resetDB);
    
      it("returns null when searching for a user with an id that does not exists", (done) => {
        userHandler.findUserById( {user_id: "U-1234567"} )
          .then((result) => {
            expect(result).to.be.null;
            done()
          })
      })
    })
    

    这里是输出:

    tomk@tomk-Latitude-7480 ~/workspace/fundme/server (login_with_github) $ npm test
    
    > fundme-server@1.0.0 test /home/tomk/workspace/fundme/server
    > mocha tests/*.spec.js
    
    
    
      tests the user_handler
    resetDB called
    resetDB finished
        ✓ returns null when searching for a user with an id that does not exists
    resetDB called
    resetDB finished
    
    
      1 passing (64ms)
    
    ^CTerminated
    

    如果它是相关的(尽管我不这么认为),被测试的函数使用的是 mysqlConnectionPool mysql2 图书馆

    这是 resetDB 我使用的函数 beforeEach after 以下内容:

    function resetDB() {
      console.log("resetDB called")
      command =
        "mysql" +
        " --defaults-extra-file=" + mysql_conf_file +
        " --host " + process.env['MYSQL_HOSTNAME'] +
        " -D fundme < " + testing_db_file_location;
      cp.execSync(command);
      console.log("resetDB finished")
    }
    

    对我可能忘记的事情有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Tom Klino    6 年前

    既然你说你用的是 mysqlConnectionPool 是的。我猜您可能没有关闭池,这导致您的程序继续等待所有连接关闭。

    从文件来看: Using connection pools

    // Don't forget to release the connection when finished!

    完成后释放连接非常重要。检查并确保您正在执行此操作 after() 每次或所有测试:

    // For pool initialization, see above
    pool.getConnection(function(err, conn) {
       // Do something with the connection
       conn.query(/* ... */);
       // Don't forget to release the connection when finished!
       pool.releaseConnection(conn);
    })
    

    或者,因为这只是一个测试文件,关闭 after 确保摩卡在最后停下来:

    after(() => { mysqlConnectionPool.end() })