什么'这个异步JavaScript函数的单元测试是错误的(通过Mocha/Sinon)
What's wrong with this unit test of an async JavaScript function (via Mocha/Sinon)?
我试图把一个小例子放在一起向同事展示,但我无法弄清楚我放在要点中的这个测试出了什么问题。
本质上,我想测试一个异步的函数,但使用Sinon的spy()功能来确保它完成:
function asyncHello(name, delay, cb) {
setTimeout(function() {
console.log("running after ", delay);
cb("hello " + name);
}, delay);
}
suite('Mega Suite', function(){
suite("testing async hello", function() {
test('should call the callback', function(done) {
var cb = sinon.spy();
asyncHello("foo", cb);
cb.should.have.been.called();
done();
});
});
});
本以为使用Mocha和done()来解决依赖于异步函数(在本例中为setTimeout)的测试会奏效,但也许有人可以指出我错了。谢谢
您不需要Sinon:
function asyncHello(name, delay, cb) {
setTimeout(function() {
console.log("running after ", delay);
cb("hello " + name);
}, delay);
}
suite('Mega Suite', function(){
suite("testing async hello", function() {
test('should call the callback', function(done) {
asyncHello("foo", 1000, function () {
done();
});
});
});
});
这个代码中有两个问题:
您调用了
asyncHello("foo", cb);
,使得函数内的delay
参数设置为cb
,而函数内的cb
参数未定义。即使在修复了第一项之后,在传递给
setTimeout
的函数能够执行之前,也调用了cb.should.have.been.called();
。你基本上不需要使用Sinon,因为如果你只设置一个回调来调用
done()
,那么你就知道测试成功了。如果任何地方出现问题,done()
都不会被调用,测试就会失败。
相关文章:
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- 克服错误的更优雅的方法是什么:需要对象说明符.当通过JXA通过Messages发送SMS时,参数没有对象说明符
- 为什么jqPlot显示了一个错误的饼图,其中包含通过AJAX检索的数据
- 通过AJAX发送文件返回'blob'错误
- 通过 AJAX 检索 Blob 时处理错误消息
- 通过 Ajax 向 PHP 发送错误的数据
- CSS 大小相互依赖和在 Chrome 中通过 JS 调整大小:可能的错误
- Chai 期望 [函数] 抛出一个(错误)未通过测试(使用 Node)
- 保存通过Ajax返回的信息后出现$_POST错误
- Jquery通过媒体查询切换窗口大小的错误
- 通过AJAX访问时,$_POST中出现未定义的索引错误
- Firefox 14.0.1在读取通过AJAX发送的JSON文件时返回错误
- 谷歌自定义搜索结果通过代理显示错误
- Javascript/Amazon s3-通过threejs加载Javascript文件时出现访问控制源错误
- 可能未处理通过测试时出现错误
- 如何消除这个错误(通过选择器查找元素)
- 错误:通过ajax(从数据库)显示注释(laravel 5.2)
- 访问控制源错误通过jQuery调用谷歌自定义搜索API
- Google联系人API错误:通过脚本加载请求超时.可能的原因:源URL不正确;提要需要身份验证
- 错误通过JavaScript启动工作流