我正在处理混合节点样式回调和 Bluebird 承诺的代码,我需要为它编写一些单元测试。
特别是,cache.js
公开了init()
与 Promise 一起使用的函数。然后它被doSomething()
另一个文件(例如index.js
)中的函数调用,该文件又接受必须在init()
.
伪代码如下:
// [ cache.js ]
function init() {
return performInitialisation()
.then((result) => return result);
}
// [ index.js ]
var cache = require('./cache');
function doSomething(callback) {
console.log('Enter');
cache.init()
.then(() => {
console.log('Invoking callback');
callback(null);
})
.catch((err) => {
console.log('Invoking callback with error');
callback(err);
});
console.log('Exit');
}
可能的单元测试可能是(仅显示相关代码):
// [ index.test.js ]
...
var mockCache = sinon.mock(cache);
...
it('calls the callback on success', function(done) {
mockCache.expects('init')
.resolves({});
var callback = sinon.spy();
doSomething(callback);
expect(callback).to.have.been.calledOnce;
done();
});
该测试通过,但是将期望更改为not.have.been.calledOnce
也通过,这是错误的。
此外,控制台日志乱序:
Enter
Exit
Invoking callback
我研究了几种可能性,但都没有奏效:
使用 chai-as-promised,例如
expect(callback).to.eventually.have.been.calledOnce;
重构
doSomething()
简单:函数 doSomething(callback) { cache.init() .asCallback(callback); }
谁能帮我理解我做错了什么以及如何解决它?