【问题标题】:Mocha/Sinon test mongoose inside expressMocha/Sinon 测试猫鼬里面的快递
【发布时间】:2025-11-22 21:30:01
【问题描述】:

我尝试用 mocha、supertest 和 sinon 测试这条快速路线。测试无法通过承诺,它在 User.find 回调函数中的第一次猫鼬调用后停止,并带有待处理的错误消息:

错误:超过 2000 毫秒的超时。确保在此测试中调用了 done() 回调。

我在回调中调用了 done() 但什么也没...

module.exports = function(app, User) {
app.route('/appointments')
.post(function(req,res){

    User.find({'department': req.body.department}, function(err, workers){
        return workers._id;
    }).then(function(allWorkers){

        var deferred = Q.defer();

        function sortWorkers(worker){
            return Appointments.find({worker: worker._id, start: req.body.date});
        };

        Q.all(_.map(allWorkers, sortWorkers)).done(function (val) {
            deferred.resolve(val);
        });

        return deferred.promise;

    }).then(function(workers){
        console.log(workers);
    })
    .catch(function(error) {
        console.log(error);
    })
    .done();
})
};

这是我的开始测试:

it("should save a user and not save the same", function(done){
    var appointments = new Appointments({title: 'okok',worker: '580359c86f7159e767db16a9',start:'2015-04-08T02:50:04.252Z' ,department: 95});

    console.log('appointments',appointments);
    request(app)
    .post("/appointments")
    .send(appointments)
    .expect(200)
    .end(function(err,res){
        console.log('ok',res);
        done();
    });
});

【问题讨论】:

    标签: node.js mongoose promise mocha.js sinon


    【解决方案1】:

    首先,您无需通过User.find promise 致电done

    另外,您的 app.route('/appointments').post 永远不会返回任何响应,请尝试添加

    res.end();
    

    您的承诺的.then.catch 上有console.log。您也可以使用 HTTP 状态码,例如

    ...
    }).then(function(workers){
       res.status(200).end();
    })
    .catch(function(error) {
       res.status(500).end();
    })
    

    这将确保在您的测试中调用 .end(function(err,res){ ... }) 并调用正确的 done 函数。

    【讨论】:

      【解决方案2】:

      您应该始终从单元测试中返回承诺。 您只需在 request(app) 之前添加 return

      return  request(app)
              .post("/appointments")
              . . .
              .then(() => {
                 expect(<your actual value>).to.equal(<expected value>)
              })
      

      【讨论】:

      • 是的,我尝试了这个,但它不起作用我认为问题是 Q.all() 在这个级别的测试请求块期间。如何测试这个?
      【解决方案3】:

      我找到了解决方案: 在我的一些 .then 函数中,如果工人数组为空,则不返回任何条件,这就是为什么我的测试返回 超过 2000 毫秒的超时

      我补充:

      User.find({'department': req.body.department}, function(err, workers){
              if(workers.length == 0){
                  res.status(500).json({ message: "Nobody in this department" });
              }
              return workers;
          })...
      

      【讨论】:

        最近更新 更多