我有一个场景,我希望在单个测试中对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
返回的值。
当这个测试通过时,有没有办法消除POST期望中的空回调函数?
如果我没有回调,则得分返回0并且测试失败。如果我使用done
作为回调,则会收到错误,因为已多次调用done。
答案 0 :(得分:1)
你说它的工作原理如图所示,但当你删除它失败的空回调时。
我认为它不应该使用或不使用回调,因为所有这些帖子都是异步调用。你解雇了其中的20个,然后马上做了一个。你有一个竞争条件,你很幸运,在你获得之前,帖子已经完成。 (使用空的回调函数,你赢得了这种竞争条件,没有你正在失去它。)
要修复竞争条件,您需要等待帖子完成才能获得分数。
当完成post(或get)请求时,将调用回调函数。因此,直接的方法是触发第一个帖子,然后在其回调中触发下一个帖子,或者如果它是获取请求的最后一个消息。
这样做是一种讨厌的代码,你可能想要使用promises。我搜索了一下,显然有一个名为supertest-as-promised的npm模块。
答案 1 :(得分:0)
我想回答您的问题,假设您想在自己的功能中实际执行此操作,而不仅仅是您正在使用的.expect
来电。< / p>
人们通常处理此问题的方法是检查是否将回调参数传递给函数,例如:
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
}
});
这也使您的应用程序在承诺和链接等方面更好地工作。
现在,在您的具体情况下,您可以完全省略回调,事情应该可以正常工作。