Javascript 测试不';由于挂起的MongoDB连接(@hapi/lab,MongoDB内存服务器,节点),无法完成

Javascript 测试不';由于挂起的MongoDB连接(@hapi/lab,MongoDB内存服务器,节点),无法完成,javascript,node.js,mongodb,unit-testing,hapijs,Javascript,Node.js,Mongodb,Unit Testing,Hapijs,我遇到了这个问题,所有的测试都成功通过了,但最终,这个过程永远不会结束。我能看到的是,总是有两个mongod进程实例在运行 我正在使用mongodb内存服务器库模拟数据库连接、最新版本的mongodb和hapijs环境 const { expect } = require ('@hapi/code'); const lab = exports.lab = require ('@hapi/lab').script (); const { it, describe, after, before }

我遇到了这个问题,所有的测试都成功通过了,但最终,这个过程永远不会结束。我能看到的是,总是有两个
mongod
进程实例在运行

我正在使用
mongodb内存服务器
库模拟数据库连接、最新版本的
mongodb
hapijs
环境

const { expect } = require ('@hapi/code');
const lab = exports.lab = require ('@hapi/lab').script ();
const { it, describe, after, before } = lab;
const Sinon = require ('sinon');
const DAO = require ('./index');
const CaseBaseDao = require ('case-base-dao'); //from private npm repo

let baseDaoFindStub;
let updateOneStub;

describe ('Profiles DAO', () =>
{
    before (async ({ context }) =>
    {
        const { MongoClient } = require ('mongodb');
        const { MongoMemoryServer } = require ('mongodb-memory-server');
        const mongoServerInstance = new MongoMemoryServer ({ instance: { port: 27018, dbName: 'administration' } });

        const url = await mongoServerInstance.getConnectionString ();
        const dbClient = await MongoClient.connect (url);
        const collection = await dbClient.db ().createCollection ('profiles');
        await collection.insertMany (require ('./examples/profiles.json'));
        const dao = DAO () (dbClient.db ());

        context.dbClient = dbClient;
        context.mongoServerInstance = mongoServerInstance;
        context.sandbox = Sinon.createSandbox ();
        context.dao = dao;

        baseDaoFindStub = context.sandbox.stub (CaseBaseDao.BaseDao.prototype, 'find').resolves ();
        updateOneStub = context.sandbox.stub (dao.collection, 'updateOne').resolves ();
    });

    after (async ({ context: { sandbox, dbClient, mongoServerInstance } }) =>
    {
        await dbClient.close (); // only added for debug purposes
        await mongoServerInstance.stop (); // only added for debug purposes
        sandbox.restore ();
    });

    it ('Should expose DAO methods', ({ context: { dao } }) =>
    {
        expect (dao).to.be.an.object ();
        expect (dao.findByEmail).to.exist ();
        expect (dao.find).to.exist ();
        expect (dao.findByQuery).to.exist ();
        expect (dao.updateOneById).to.exist ();
        expect (dao.addSmartPerformanceDashboards).to.exist ();
        expect (dao.deleteSmartPerformanceDashboards).to.exist ();
        expect (dao.updateSmartPerformanceDashboards).to.exist ();
    });
});
还有很多测试,但是如果我只执行这一个,它最终会被卡住

如果我尝试在
after
块中手动关闭连接,则会出现以下错误:

对于
等待dbClient.close()

消息:“非法调用”

堆栈:“类型错误:在handleWriteReq(internal/stream\u base\u commons.js:46:26)处非法调用\n在writeGeneric(internal/stream\u base\u commons.js:139:15)\n在Socket处非法调用。\u writeGeneric(net.js:771:11)\n在Socket处。\u write(net.js:783:8)\n在doWrite(\u stream\u writeable.js:431:12)\n在writeOrBuffer(\u stream\u writeable.js:415:5)\n在Socket.Writable.write(_stream_Writable.js:305:11)\n在Connection.write({path}/node_modules/mongodb/lib/core/Connection/Connection.js:265:21)\n在{path}/node_modules/mongodb/lib/core/Connection/pool.js:732:21)\n在checkStatus({path}/node_modules/mongodb/lib/core/Connection/pool.js:732:21)\n在pool.destroy({path}/Server.destroy上的node_modules/mongodb/lib/core/connection/pool.js:739:3)\n({path}/node_modules/mongodb/lib/core/topologies/Server.js:897:15)\n

对于
等待mongoServerInstance.stop();

消息:“方法Promise.prototype.then在不兼容的接收器上调用”

stack:“TypeError:方法Promise.prototype.then在Promise.then()处调用了不兼容的接收方#\n”

我已经尝试了几乎所有的方法:更改端口,使用承诺而不是异步/等待,避免使用Sinon和存根(以防万一),等等,我已经没有主意了

我正在使用完全相同的代码模拟其他项目中的数据库,它工作得很好,不需要手动关闭数据库连接,它只是自动完成

这种情况在我的本地环境中发生,在Bitbucket管道中也发生过,因此,被丢弃成为与我的计算机相关的东西。

最终解决了它

不确定为什么会发生这种情况,但解决方案不是通过@hapi/lab
context
使用mongo实例相关变量关闭MongoDB连接,而是在
之前的
块之外定义它们。因此:

let baseDaoFindStub;
let updateOneStub;
let mongoServerInstance;  // Now defined here
let dbClient;             // Now defined here

describe ('Profiles DAO', () =>
{
    before (async ({ context }) =>
    {
        const { MongoClient } = require ('mongodb');
        const { MongoMemoryServer } = require ('mongodb-memory-server');
        mongoServerInstance = new MongoMemoryServer ({ instance: { port: 27018, dbName: 'administration' } });

        const url = await mongoServerInstance.getConnectionString ();
        dbClient = await MongoClient.connect (url);
        const collection = await dbClient.db ().createCollection ('profiles');
        await collection.insertMany (req
...
...
...

after (async ({ context: { sandbox } }) =>  // Don't get vars from context
    {
        sandbox.restore ();
        await dbClient.close ();
        await mongoServerInstance.stop ();
    });
使用@hapi/lab
context
,我已经不是第一次遇到这种问题了,所以要小心