测试是否调用带有Promise的方法(Jest)

时间:2018-05-31 19:05:29

标签: promise jestjs sinon

我有一个初始化方法,调用另一个返回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部分 - 这样做的最佳做法是什么?

1 个答案:

答案 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秒