如何测试嵌入式异步调用

时间:2019-04-22 15:49:48

标签: jestjs

我正在测试一个函数(父级),该函数调用返回承诺的函数(slomo)。我想检查.then()中的代码是否正在执行。

function slomo() {
  return new Promise(function (resolve, reject) {
    resolve('good')
    reject('bad')
  })
}

child = jest.fn()

function parent() {
  slomo()
    .then((result) => {
      child()
    })
}

// TEST

it('runs child', () => {
  parent()
  expect(child).toHaveBeenCalledTimes(1)
})

结果是:

Expected mock function to have been called one time, but it was called zero times.

我已经确认通过console.log调用了子功能,但是之后测试已完成。

我尝试通过并在测试中调用done,但这不能解决问题。

也许上面的代码是反模式,需要重写才能进行测试?

非常感谢您能给我的帮助!

账单

1 个答案:

答案 0 :(得分:1)

您正确找到了问题的根本原因,即测试早于异步代码完成,所以test should track async correctly。但是似乎您丢失了承诺b / c,但您没有将其退还,所以:

compareTo()

接下来,您只需添加function parent() { return slomo() // <<<--- add return .then((result) => { child() }) }

done

或只返回承诺:

it('runs child', (done) => { // <<<< --- add done
  parent().then(() => {
    expect(child).toHaveBeenCalledTimes(1)
    done(); // <<<< -- done should be called after all
  })
});

希望有帮助。

相关问题