как проверить встроенный асинхронный вызов - PullRequest
1 голос
/ 22 апреля 2019

Я тестирую функцию (родитель), которая вызывает функцию (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.

Я подтвердил, что дочерняя функция IS вызывается через console.log, но она регистрируется ПОСЛЕ тест завершен.

Я пытался передать и вызвать done внутри теста, но это не решило проблему.

может быть, приведенный выше код является анти-паттерном и должен быть переписан, чтобы его можно было проверить?

любая помощь, которую вы можете мне оказать, очень ценится!

Счет

1 Ответ

1 голос
/ 22 апреля 2019

Вы правильно нашли основной случай проблемы: тест завершается раньше, чем асинхронный код, поэтому test должен правильно отслеживать асинхронную . Но, кажется, вы потеряли обещание, потому что вы его не вернете, поэтому:

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
  })
});

или просто верните обещание:

it('runs child', () => {
  return parent().then(() => {  // <<<--- return
    expect(child).toHaveBeenCalledTimes(1);
  })
})

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...