我有一个场景,我想在单个测试中对 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
作为回调,则会收到错误,因为 did 被多次调用。
最佳答案
你说它的工作原理如图所示,但是当你删除空回调时它会失败。
我认为无论有没有回调它都不应该工作,因为所有这些帖子都是异步调用。你发射了 20 个,然后立即进行攻击。你有一个竞争条件,你很幸运,帖子在你获取之前就已经完成了。 (使用空回调函数,您将赢得此竞争条件,而如果没有,您将失去它。)
要解决竞争条件,您需要等待帖子完成才能获取分数。
当 post(或 get)请求完成时,回调函数将被调用。因此,直接的方法是触发第一个帖子,然后在其回调中触发下一个帖子,或者如果它是最后一次触发 get 请求。
这样做是一种令人讨厌的代码,您可能想使用 Promise 来代替。我搜索了一下,显然有一个名为 supertest-as-promised 的 npm 模块.
关于javascript - 如何在没有空回调的情况下测试多个调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28884503/