如何在没有空callback的情况下testing多个调用

我有一个场景,我想在单个testing中对Express服务的Node.js服务进行多个REST调用,即:

var request = require('supertest'), should = require('should'), game = require('../game.js').app; describe('single pin game of bowling', function(done) { it('should return 20', function(done) { for(var i = 0; i < 20; i++) { request(game).post('/bowl/1').expect(200, function(){}); } request(game).get('/score').expect('20', done); }); }); 

在这个阶段,POST调用会增加/score返回的值。

虽然这个testing通过,有没有办法消除POST期望中的空callback函数?

如果我没有回叫,分数返回0,testing失败。 如果我使用done作为callback,我得到一个错误,因为完成调用多次。

你说它如图所示,但是当你删除空的callback,它失败了。

我认为它不应该有或没有callback,因为所有这些职位是asynchronous调用。 你发射了20个,立即搞定。 你有一个竞争条件,你幸运的是,在获得之前,post已经完成。 (空callback函数你赢得了这种竞争条件,没有你失去它。)

为了解决比赛条件,你需要等待post完成之后才能得分。

当post(或get)请求完成时,调用callback函数。 所以最简单的方法是先发射第一个信号,然后在下一个信号的callback中发射,或者如果这是最后一次发射的请求。

这样做是一种讨厌的代码,你可能想用promise来代替。 我search了一下,显然有一个叫做supertest-as-promise的npm模块。

我要回答你的问题,假设你想用自己的function来做这个事情,而不仅仅是你正在使用的.expect调用。

人们通常处理这个的方式是检查一个callback参数是否被传递给函数,例如:

 function add(input1, input2, cb) { var result = input1 + input2; if (cb) { cb(null, result); // since our callback exists, call it! } else { return result; // if not callback was given, just return the value } }); 

这也使您的应用程序更好的承诺和链接的东西。

现在,在你的具体情况下,你可以完全省略callback,事情应该正常工作。