我试图将一个小例子放在一起展示同事,但无法弄清楚这个测试有什么问题that I've put in a gist。
基本上我想测试一个执行异步操作的函数,但是使用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)会起作用,但也许有人可以指出我错在哪里。谢谢!
答案 0 :(得分:0)
你不需要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
参数未定义。
即使在修复第一项cb.should.have.been.called();
之后,在传递给setTimeout
的函数可以执行之前,也会调用它。
您基本上不需要使用Sinon,因为如果您只是设置回调来调用done()
,那么您就知道测试成功了。如果在任何地方done()
无法调用问题,测试将失败。