为使用 setTimeout() 的异步函数编写 Mocha 测试
Writing Mocha Test for Async functions which uses setTimeout()
不知何故,我无法为一个相对非常简单的函数编写 Mocha JS 测试。 JavaScript 源文件如下所示
exports.cb = function() {
console.log("The function is called after 3 seconds");
}
exports.testfn = function(cb) {
setTimeout(cb, 3000);
}
而测试代码写成
describe('Main Test', function(){
it('A callback Tests', function(done){
asn.testfn(asn.cb);
done();
});
});
我遇到了 2 个问题。
- 测试代码直接以done()结束
- 如果我不调用 done(),则调用函数但测试失败,因为它预期为异步函数调用 done()
我查看了文档,但不确定如何完成。
我可以使用 promises 编写测试,而且效果很好。但是对于需要用到setTimeout的场景,应该怎么设置呢?
describe('Main Test', function(){
it('A callback Tests', function(done){
asn.testfn(function() {
asn.cb();
done();
});
});
});
假设你要测试的是testfn
,你不会使用cb
,你会在测试中使用回调;看评论:
describe('Main Test', function(){
it('testfn calls the function after three seconds', function(done){
// Remember the start time
var start = Date.now();
// Schedule callback
asn.testfn(function() {
// Has it been at least three seconds?
if (Date.now() - start < 3000) {
// No, trigger an error
} else {
// Yes, all's good!
done();
}
});
});
});
如果你出于某种原因想调用 asn.cb
,你可以在上面的匿名函数中调用,但如果你想测试 asn.cb
,你应该从测试 asn.testfn
.
不知何故,我无法为一个相对非常简单的函数编写 Mocha JS 测试。 JavaScript 源文件如下所示
exports.cb = function() {
console.log("The function is called after 3 seconds");
}
exports.testfn = function(cb) {
setTimeout(cb, 3000);
}
而测试代码写成
describe('Main Test', function(){
it('A callback Tests', function(done){
asn.testfn(asn.cb);
done();
});
});
我遇到了 2 个问题。
- 测试代码直接以done()结束
- 如果我不调用 done(),则调用函数但测试失败,因为它预期为异步函数调用 done()
我查看了文档,但不确定如何完成。
我可以使用 promises 编写测试,而且效果很好。但是对于需要用到setTimeout的场景,应该怎么设置呢?
describe('Main Test', function(){
it('A callback Tests', function(done){
asn.testfn(function() {
asn.cb();
done();
});
});
});
假设你要测试的是testfn
,你不会使用cb
,你会在测试中使用回调;看评论:
describe('Main Test', function(){
it('testfn calls the function after three seconds', function(done){
// Remember the start time
var start = Date.now();
// Schedule callback
asn.testfn(function() {
// Has it been at least three seconds?
if (Date.now() - start < 3000) {
// No, trigger an error
} else {
// Yes, all's good!
done();
}
});
});
});
如果你出于某种原因想调用 asn.cb
,你可以在上面的匿名函数中调用,但如果你想测试 asn.cb
,你应该从测试 asn.testfn
.