【问题标题】:timeout exceeded error in Async Mocha tests异步摩卡测试中的超时超出错误
【发布时间】:2013-07-11 13:28:52
【问题描述】:

我正在使用 Mocha 并且应该用于测试简单的数据库查询,我正在尝试为简单的 Moongose 架构函数运行异步测试,但每次都会遇到超时超出错误。

  Error: timeout of 15000ms exceeded
  at null.<anonymous> (/usr/local/lib/node_modules/mocha/lib/runnable.js:165:14)
  at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

我什至使用过 this.timeout(15000) 并在 mocha 命令中尝试过 --timeout 15000 但没有成功,我给的超时时间是多少收到此错误。只有同步测试通过。以下是我要测试的测试和功能。

我的摩卡测试:-

   describe('#getFacility()', function () {
    this.timeout(15000);
    it('should get facility successfully', function (done) {
        db.getFacilites(Data.testFacility, function (err, facilities) {
            if (err) throw err;
            facilities.Name.should.equal(Data.testFacility.body.Name);
            done();
        })
    });
});

我的数据:-

testFacility : {
    params:  { clientId:"51c85c3267b6fc1553000001" }
},

我的获取函数

getFacilites: function (req, res) {
    Facility.find({Client: req.params.clientId}, function (err, facilities) {
        if(err) {
            res.send(500,err);
        } else if (!facilities) {
            res.send(404, "facilities not found");

        } else if (req.query.format && req.query.format === 'select') {
            var result = facilities.map (function (f) {
                return { value: f._id.toString(), text: f.Name }
            });
            res.json(result);

        } else {
            console.log("Cannot Retrieve Facilities");
        }
    });
}

我什至还为查询创建了一个新的单独函数,但它仍然无法正常工作。任何具有类似功能的想法。

describe('#getFacility() direct from DB', function () {
    it('should get facility successfully from db', function (done) {
        Client_data.Facility.find({Client: Data.testFacility.params.clientId}, function(err, facilities) {
            if (err) throw (err);
            if (facilities) {
                facilities.forEach(function (f) {
                    console.log(f);
                });
                done();
            }
        });
    });
});

如果我尝试在查询后调用 done() 回调,测试通过,但这也不好看 对我来说。

describe('#addFacility()', function () {
    it('should add facility successfully', function (done) {
        API_Calls.addFacility(Data.testFacility, function (doc) {
            doc.Name.should.equal(Data.testFacility.body.Name);
        });
        done();
    });
});

【问题讨论】:

    标签: javascript node.js mongoose mocha.js should.js


    【解决方案1】:

    您的 getFacilities 正在接受 req、res 和 next,而您在测试中传递了一些完全不同的东西(一个 testFacility 对象和一个回调)。

    我认为您的 getFacilities 方法定义不应该采用 req、res 和 next,可能是 clientId 和 next,然后根据 next 的回调,您可以创建适当的响应。

    【讨论】:

    • 我使用的是 req、res 和 next,因为这个函数是作为对 URL 的 app.get 请求的结果调用的。 app.get('/api/facility/:clientId', db.getFacilites);
    • @SulemanMirza 然后你需要将它作为路由处理程序进行测试,传递一个(可能是模拟的)RequestResponsefunction(err)。或者重构,所以你有 2 个函数——1)用于查询,2)用于路由处理程序——所以第一个(查询)可以在测试中使用,正如它所期望的那样。
    • 感谢您帮助乔纳森,现在我尝试使用单独的功能进行查询,但它仍然无法正常工作。仍然出现超时错误。
    • 如果我在数据库查询后调用 done() 回调测试通过,但我认为这也不正确。
    猜你喜欢
    • 2019-06-13
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2017-06-10
    • 2018-05-24
    • 2015-05-23
    相关资源
    最近更新 更多