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