我有一个初始化方法,调用另一个返回promise的方法,如:
initStuffAfterLoad() {
const _this = this;
const theInterval = window.setInterval(function() {
if (thing) {
window.clearInterval(theInterval);
_this.getBanana()
.then(response => {
_this.getApple(response, _this);
});
}
}, 100);
}
我需要测试getBanana
是否被调用(jest / sinon)。到目前为止,我有:
test('init function calls getBanana', () => {
let thing = true
const getBananaSpy = sinon.spy();
sinon.stub(TheClass.prototype, 'getBanana').callsFake(getBananaSpy).resolves();
jest.useFakeTimers();
TheClass.prototype.initStuffAfterLoad();
jest.runOnlylPendingTimers();
expect(getBananaSpy.called).toBeTruthy();
TheClass.prototype.getBanana.restore();
});
但是在断言时它仍会收到false
。我认为我没有正确处理Promise部分 - 这样做的最佳做法是什么?
答案 0 :(得分:0)
我对sinon不熟悉,但是这里有一种方法可以通过纯粹的玩笑来达到你的需要(更好的是它还会检查getBan在getBanana解析时是否被调用:))
jest.useFakeTimers()
const _this = {
getBanana: () => {},
getApple: () => {}
}
const initStuffAfterLoad = () => {
const theInterval = window.setInterval(function() {
window.clearInterval(theInterval);
_this.getBanana().then(response => {
_this.getApple(response, _this)
});
}, 100);
}
test('', () => {
let result
_this.getBanana = jest.fn(() => {
result = new Promise( resolve => { resolve() } )
return result
})
_this.getApple = jest.fn()
initStuffAfterLoad()
jest.runAllTimers()
expect(_this.getBanana.mock.calls.length).toBe(1)
return result.then(() => {
expect(_this.getApple.mock.calls.length).toBe(1)
})
})
代码测试:)
通过测试\temp.test.js√(25ms)
测试套房:1次通过,1次
测试:1次通过,1次
快照:总计0
时间:2.489秒