Mocha/Sinon 测试猫鼬里面的快递

Posted

技术标签:

【中文标题】Mocha/Sinon 测试猫鼬里面的快递【英文标题】:Mocha/Sinon test mongoose inside express 【发布时间】:2017-02-27 01:49:03 【问题描述】:

我尝试用 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();
    );
);

【问题讨论】:

【参考方案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;
    )...

【讨论】:

以上是关于Mocha/Sinon 测试猫鼬里面的快递的主要内容,如果未能解决你的问题,请参考以下文章

跟踪使用 Sinon/Mocha 调用方法的次数

使用 Sinon 存根 window.location.href

猫鼬/快递人口问题

vue项目目录结构详解

vue项目目录结构详解

快递+猫鼬登录