尽管使用 done,Mocha 在 Before 钩子中调用异步承诺链超时

Posted

技术标签:

【中文标题】尽管使用 done,Mocha 在 Before 钩子中调用异步承诺链超时【英文标题】:Mocha times out calling async promise chain in Before hook despite using done 【发布时间】:2020-03-25 17:29:04 【问题描述】:

我正在使用 node.js 上的 mocha 和 chai 将异步集成测试套件运行到猫鼬数据库中。大多数都运行良好,但对于一个我必须使用 before 钩子执行一些预测试 db-prep。当我在前钩子中使用 Done 时,Mocha 超时。

我收到的错误是“错误:超过 5000 毫秒的超时。对于异步测试和挂钩,请确保调用了“done()”;如果返回 Promise,请确保它已解决。(/Users/donfelipe/Sites/Agents /test/agents.js)"

已尝试将 done() 移动到 promise 链末尾的 finally 块中,但这只会导致 it 块在异步链完成执行之前运行。有点难过。

/* 
    test case to check that the get function returns
*/
process.env.NODE_ENV = 'test-db';
'use strict'

const mongoose = require("mongoose");
const schemas = require('../app_api/models/schemas');
const agents = require('../app_api/controllers/agents.js');
const lists = require('../app_api/controllers/lists.js');
const server = require('../app.js');
const assert = require('assert')
const config = require('config')

//Require the dev-dependencies
const chai = require('chai');
const chaiHttp = require('chai-http');
const should = chai.should();

chai.use(chaiHttp);

describe('Agents test Suite', () => 
    beforeEach(() => 
        //don't have anything too do in this case
    )


    describe('/GET listAddItem suite', function () 

        //before we can test deletion we have to add at least one list in.
        const userModel = mongoose.model('User', schemas.userSchema);
        const agentModel = mongoose.model('Agent', schemas.agentSchema);
        let agentToAddId = 
        const listObject = 
            listName: 'testList',
            _id: mongoose.Types.ObjectId(),
            agents: [
                _id: "00000000000000000000000",
                name: "Test agent"
            ]
        
        const lengthToTestAgainst = listObject.agents.length

        beforeEach((done) => 
             userModel.findById(config.defaultUserId)
                .select('agentList')
                .then((parentDoc) => 
                    if (!parentDoc) 
                        console.error('Unable to find user');
                    
                    parentDoc.agentList.push(listObject)
                    return parentDoc.save()
                )
                .then(() => 
                    return agentModel.find()
                )
                .then((response) => 
                    agentToAddId = response[0]._id
                    //console.log(response[0]._id);
                    done()
                )
        )

        it('should add a new item into the testList', (done) => 
            chai.request(server)
                .get(`/agents_api/listAddItem/$config.defaultUserId/$listObject._id/$agentToAddId`)
                .end((err, response) => 
                    response.should.have.status(200)
                    response.body.agentList.testList.should.not.be.equal(lengthToTestAgainst + 1)
                    done(err)
                )

        )
    )

)

【问题讨论】:

【参考方案1】:

呃。自己解决了这个问题。尾巴摇狗的真实案例。 所以我模拟了 chai.request(server) 对 API 的调用:

/agents_api/listAddItem/$config.defaultUserId/$listObject._id/$agentToAddId

并通过 POSTMAN 提交。结果发现 API 中有一个错误,所以它没有返回响应,所以我从 Mocha 得到的超时是一个有效的响应,请求只是挂起。

【讨论】:

以上是关于尽管使用 done,Mocha 在 Before 钩子中调用异步承诺链超时的主要内容,如果未能解决你的问题,请参考以下文章

mocha before() 中的异步函数总是在 it() 规范之前完成?

为啥传递的函数是不是带参数对 Mocha 的 `before()` 很重要?

在 mocha 测试中使用带有 ts-node 的断言

javascript 解释Mocha的测试框架 - describe(),it()和before()/ etc钩子

如何使用async-await然后在一个Mocha测试中完成?

Mocha 忽略了一些测试,尽管它们应该运行