我正在处理混合节点样式回调和蓝鸟许诺的代码,我需要为它编写一些单元测试。在诺言链末端测试回调调用
特别是,cache.js
公开了init()
函数,该函数使用promise。然后在另一个文件(例如index.js
)中由doSomething()
函数调用,该函数又接受必须在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
我也考虑过多种可能性,其中没有一个工作:
使用柴作为许诺的,例如
expect(callback).to.eventually.have.been.calledOnce;
重构
doSomething()
是简单地:功能的doSomething(回调){ cache.init() .asCallback(回调); }
谁能帮助我理解我在做什么错了,我怎么能解决这个问题吗?
谢谢你的回复。 如果我做'doSomething(()=> done());'那么我将无法测试错误条件,对吧?我的意思是我不会看到回调是否与错误参数一起被调用。 – rippeltippel
@rippeltippel你处理回调,所以'done'被调用,测试通过_is_你的支票。如果由于某种原因'callback'没有被调用,你的测试会超时。 – James
有道理,谢谢。 – rippeltippel