Асинхронный / ожидающий обрабатывает необработанные ошибки отклонения по-другому? - PullRequest
0 голосов
/ 12 марта 2020

В следующем кодовом блоке (пример # 1) expect(this.req.headers["user-agent"]).to.equal("BOOM") выдает ошибку и тест не проходит.

describe("http.get with headers", () => {
  it("should return response with status code 200", async () => {
    const userAgent =
      "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:74.0) Gecko/20100101 Firefox/74.0"
    nock("https://api.example.net")
      .get("/hello")
      .reply(function() {
        expect(this.req.headers["user-agent"]).to.equal("BOOM")
        return [200]
      })
    const httpInstance = new http({
      headers: {
        "user-agent": userAgent,
      },
    })
    let response = await httpInstance.get("https://api.example.net/hello")
    expect(response.statusCode).to.equal(200)
  })
})

В следующем кодовом блоке (пример # 2) expect(requestBody.message).to.equal("BOOM") выдает «тихий» ошибка (return [200] никогда не выполняется), но тест проходит. Почему?

describe("logger.captureMessage(message, callback)", () => {
  it("should send captured exception to sentry", () => {
    return new Promise((resolve, reject) => {
      nock("https://sentry.io")
        .post("/api/3926156/store/")
        .reply((uri, requestBody: any) => {
          expect(requestBody.message).to.equal("BOOM")
          return [200]
        })
      logger.captureMessage("foo", () => {
        resolve()
      })
    })
  })
})

Использование catch и запуск reject работает, но почему это необходимо, когда все отлично работает в примере # 1?

describe("logger.captureMessage(message, callback)", () => {
  it("should send captured exception to sentry", () => {
    return new Promise((resolve, reject) => {
      nock("https://sentry.io")
        .post("/api/3926156/store/")
        .reply((uri, requestBody: any) => {
          try {
            expect(requestBody.message).to.equal("BOOM")
            return [200]
          } catch (error) {
            reject(error)
          }
        })
      logger.captureMessage("foo", () => {
        resolve()
      })
    })
  })
})

1 Ответ

1 голос
/ 12 марта 2020

Делать утверждения внутри обратных вызовов Nock reply не рекомендуется. Есть много слоев между тем, где эта функция выполняется и вашим тестовым исполнителем. В частности, клиент делает запрос. Обычно клиенты плохо обрабатывают ошибки, не связанные с запросом, и в конечном итоге скрывают или даже скрывают ошибку.

Не существует одного «правильного» способа сделать это. Судя по вашему второму тесту, я бы рекомендовал использовать переменную уровня теста для хранения тела запроса. Затем выполните утверждение в обратном вызове captureMessage.

Еще одно замечание: вы неправильно обрабатываете пузырящиеся ошибки в Обещании вашего второго теста. Эта строка: return new Promise((resolve, reject) => { не использует ключевое слово async, что означает, что вы должны вызвать reject вручную, иначе любая ошибка всплывающего сообщения будет потеряна в ethos.

...