我有一个包含许多 function* 类型生成器的对象,我正在尝试为其编写 Mocha 单元测试。但是,Mocha 不会调用这些函数,我很难弄清楚解决方案是什么。
这里是一些示例代码:
'use strict';
var ctr = {
fn: function(arg,cb) {
console.log( 'arg:', arg );
var err = (arg == true);
return cb( err, arg );
}
};
describe( 'Mocha test', function() {
it( 'should call the function', function(done) {
console.log('a');
ctr.fn( false, function(err,data) {
console.log('b');
if( err ) return done(err);
console.log('c');
done();
console.log('d');
});
console.log('e');
});
});
当我运行 $ mocha testfile.js
时,我得到以下输出:
Mocha test
a
arg: false
b
c
✓ should call the function (39ms)
d
e
1 passing (172ms)
这一切都符合预期。但是,如果我将“fn: function(...
”替换为“fn: function*(...
”,则运行 $ mocha testfile.js
结果:
Mocha test
a
e
1) should call the function
0 passing (2s)
1 failing
1) Mocha test should call the function:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
我想我找到了答案 Mocha plugin ,但运行 mocha -r mocha-plugin-co testfile.js
给出的结果与未指定它的结果相同。
我认为我需要“确保 Promise 得到解决”,但我不清楚这意味着什么。我没有[故意]使用 Promises,但我使用的 npm 包需要以这种形式定义的函数。
是否有一个简单的解决方案可以使 Mocha 按照我期望的方式工作,或者我是否需要将所有代码更改为常规函数并希望不会出现任何问题?
最佳答案
您应该在返回的生成器上调用 next()
方法,如下所示:
describe( 'Mocha test', function() {
it( 'should call the function', function(done) {
console.log('a');
ctr.fn( false, function(err,data) {
console.log('b');
if( err ) return done(err);
console.log('c');
done();
console.log('d');
}).next();
console.log('e');
});
});
为了使用 blakeembrey/co-mocha插件,您必须在生成器中使用 yield
才能继续执行。
关于javascript - Mocha 单元测试不调用对象内的函数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44318111/