JavaScript: тестирование обещаний с таймаутом и условиями

#javascript #promise #async-await #mocha.js #es6-promise

#javascript #обещание #асинхронный-ожидание #mocha.js #es6-обещание

Вопрос:

Я пытаюсь протестировать свои REST API с использованием Mocha и Chai.

Ниже приведен фрагмент кода

 "use strict"

// all required varibles modules declaration

describe("Get Data", function () {
  it("Get Final Data", function () {
    return getFinalResponse(
      "https://localhost/getdata",
      "GET",
      JSON.stringify(rawdata)
    )
      .then((response) => response)
      .then(async (response) => {
        console.log(response)
        let jsonData = await response.json()
        operationId = jsonData.operation
        console.log(jsonData.operation)
      })
  })
})

function delay(t) {
  return new Promise((resolve) => setTimeout(resolve, t))
}

async function restCall(url, method, data) {
  const signer = new common.DefaultRequestSigner(provider)

  const httpRequest = {
    uri: url,
    headers: new Headers(),
    method: method,
    body: data,
  }

  await signer.signHttpRequest(httpRequest)

  const response = await fetch(
    new Request(httpRequest.uri, {
      method: httpRequest.method,
      headers: httpRequest.headers,
      body: httpRequest.body,
    })
  )

  return response
}

async function getFinalResponse(url, method, data) {
  let response
  do {
    await delay(10000)
    response = await restCall(url   "/done", method, data)
  } while ((await response.json()["status"]) !== "DONE")

  return restCall(url, method)
}
  

Условие while(await response.json()["status"] !== 'DONE') прерывается / завершается через 1 минуту, но даже после истечения 2 минут в качестве тайм-аута мокко. Я не получаю ожидаемый результат.

Пожалуйста, помогите мне, в чем может быть проблема.

Комментарии:

1. где ваша обработка ошибок? возможно, произошла ошибка

2.Не должен ли it обратный вызов получать параметр обратного вызова функции с именем done ? Таким образом, вы можете вызвать done() , как только тест завершится? Или это уже известно о promise? Otoh, вы всегда вызываете restCall с одними и теми же параметрами, почему это когда-либо возвращает status DONE ? Что вы на самом деле здесь тестируете?

3. @hgb123 Вы не только изменили форматирование, но и отредактировали части кода операционной системы (например, условие while), было ли это намеренным?

4. Нет, я ничего не менял, кроме URL, поскольку это конфиденциально. Мне нужно продолжать вызывать конечную точку, пока я не получу статус «ВЫПОЛНЕНО»

5. Ошибка @Jaromanda X говорит, что время ожидания превышено, но если я запускаю конечную точку независимо, это дает мне статус «ГОТОВО», т. Е. Ожидаемый ответ в течение 1 минуты. но при выполнении условного обещания с циклом я не получаю то же самое.