Promises:对一个递归方法进行单元测试,该方法在队列中一个接一个地触发promise
Promises: Unit testing a recursive method that fires promises in a queue one after the other
我在我的项目中有一个方法,它接收一组承诺返回方法。当第一个完成后,它会移动到下一个,以此类推。我很难弄清楚如何对这个方法进行单元测试。
fireAllBatches: function (batchQueue, resolve, reject) {
if (batchQueue.length) {
var batch = batchQueue.pop();
// this returns a promise
googleCalendarService.fireBatch(batch)
.then(function (results) {
// when done fires the next one
this.fireAllBatches(batchQueue, resolve, reject);
}.bind(this)).catch(reject);
} else {
console.log('resolving firing of batches.');
resolve();
}
}
这是测试:
it('fireAllBatches should call fireBatch as many times as the number of the batches', function () {
spyOn(mockGoogleCalendarService, "fireBatch").and.returnValue(q.when({}));
datalayerObject.fireAllBatches([1, 2, 3, 4, 5, 6]);
expect(mockGoogleCalendarService.fireBatch).toHaveBeenCalled();
expect(mockGoogleCalendarService.fireBatch.calls.count()).toBe(6);
});
在调查和阅读了这个答案之后。我能够将递归方法转换为:
fireAllBatches: function (batchQueue, resolve, reject) {
var methodArray = _.map(batchQueue, function (batch) {
return function () {
console.log('firing batch');
return googleCalendarService.fireBatch(batch)
}
});
var resolvedPromise = $q.when(true);
methodArray.reduce(function(cur, next) {
return cur.then(next);
}, resolvedPromise).then(resolve).catch(reject);
}
但是,我不确定它是否能正确捕获错误。
这不是关于单元测试的具体答案。然而,如果你在ES6中工作,你可以做一些类似这样的事情来避免递归,这可能会简化你的测试:
batchQueue.reduce( (chain,batch) => {
return chain.then(googleCalendarService.fireBatch(batch))
}, Promise.resolve(null)).then(resolve).catch(reject);
我将模拟或存根googleCalendarService.fireBatch()
函数,因此您可以验证调用它的内容,然后您可以使用间谍来解析和拒绝参数。
- (可选)考虑
batchQueue
为null/undefined的情况。 - 如果
batchQueue
为空,应立即调用resolve
- 它应该调用
googleCalendarService.fireBatch
存根一次与第一批,然后调用resolve如果你传入一个队列与一个批。 - 对于两个批次的队列,它应该调用
googleCalendarService.fireBatch
stub两次,resolve
spy一次。 - 测试
googleCalendarService.fireBatch
函数是否抛出错误,reject
间谍被调用。
您还可以考虑其他测试
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- jQuery:循环一个具有不同超时值的循环
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 从javascript创建一个列表
- 节点导出返回一个空对象
- 使用clickToggle并在单击另一个元素时关闭元素
- 我可以在json对象中添加一个函数吗
- 使用javascript将动态表从一个html页面打印到另一个html页
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 表追加而不附加最后一个元素
- 我如何找到一个句子中的所有空格并替换忽略它们
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 用javascript编写一个函数队列
- jQuery创建一个函数循环,每个函数都有一个动画队列
- 为什么长度定义为一个变量,而不是使用队列.for循环的长度
- Promises:对一个递归方法进行单元测试,该方法在队列中一个接一个地触发promise
- HTML5音频:尝试创建一个队列
- JavaScript执行一个音频文件队列
- 在Javascript事件队列的开始处注册一个事件