如何在没有空回调的情况下测试多个调用
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调用递增/score
返回的值。
当这个测试通过时,有没有办法消除POST期望中的空回调函数?
如果我没有回调,分数返回0,测试失败。如果我使用done
作为回调,我会得到一个错误,因为done被调用了多次。
您说它如图所示工作,但当您删除空回调时,它失败了。
我认为无论有没有回调,它都不应该工作,因为所有这些帖子都是异步调用。你发射了20个,然后立即发射。你有一个比赛条件,你很幸运,帖子在你获得之前就已经完成了。(有了空回调函数,你就赢得了这场比赛,而没有你就失去了它。)
为了解决比赛条件,你需要等待帖子完成后再进行得分。
当post(或get)请求完成时,将调用回调函数。因此,直接的方法是启动第一个帖子,然后在回调中启动下一个帖子,或者如果这是最后一个启动get请求。
这样做是一种令人讨厌的代码,您可能需要使用promise。我搜索了一下,显然有一个名为supertest的npm模块。
我将回答您的问题,假设您想在自己的函数中实际执行此操作,而不仅仅是使用的.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
}
});
这也使您的应用程序能够更好地处理诸如promise和chaining之类的事情。
现在,在您的特定情况下,您可以简单地完全省略回调,一切都应该正常。
相关文章:
- node.js测试事件是否是在不使用超时的情况下使用sinon.js发出的
- 在禁用浏览器flash插件的情况下运行Karma测试
- 如何在没有空回调的情况下测试多个调用
- 如何在没有视网膜显示的情况下测试视网膜图像置换
- 角度单元测试:如何在没有范围的情况下测试控制器属性
- 在我的情况下,如何解决我的单元测试问题
- 如何在用户使用护照登录的情况下测试帆.js控制器.js
- Javascript if/else 语句不起作用,但是里面的代码就像我在没有 if/else 的情况下测试的那样
- 在没有节点的情况下测试Reactjs
- Mongoose创建测试数据并在没有数据库连接的情况下进行填充
- 如何使用一个函数测试Angular控制器,该函数可以在不嘲笑AJAX调用的情况下进行AJAX调用
- 单元测试javascript函数'在不知情的情况下被用于其他地方
- 在没有循环的情况下测试一组元素之间的html5数据相等性
- 如何在没有Browserify的情况下测试React组件
- 如何在我的情况下修复这个单元测试
- 如何单元测试一个函数在我的情况下
- Karma/Jasmine在没有运行测试的情况下超时
- 使用Chutzpah运行QUnit (TypeScript)测试会在已经启动的情况下在测试上下文之外调用start()
- 单元测试-如何在不重定向的情况下测试javascript重定向
- 对于量角器测试,我们可以在没有 browser.wait() 函数的情况下获得 waitElement 对象值吗?