nock: как макетировать запросы с дополнительными заголовками?Я получаю Nock: нет соответствия для запроса - PullRequest
0 голосов
/ 18 октября 2018

Я делаю следующий запрос с Axios:

axios.get("http://request.url/app.php", {
  headers: {
    "Accept": "application/json",
    "X-Application-Key": "my-api-key",
  },
  params: {
    url: "http://some/url",
    format: "json",
    param1: 1,
    param2: 99999,
  },
});

Вот макет:

const myAPI = nock("http://request.url/");

myAPI
  .get("/app.php")
  .query(({url}) => url === "http://some/url")
  .replyWithFile(200, path.resolve(__dirname, "my-response.json"), {
    "Content-Type": "application/json",
  });

Все работает нормально, пока X-Application-Key не присутствует в запросе.Когда присутствует заголовок X-Application-Key, я получаю следующую ошибку от nock:

Error: Error: Nock: No match for request {
  "method": "OPTIONS",
    "url": "<request url goes here>",
    "headers": {
    "origin": "http://localhost",
      "access-control-request-method": "GET",
      "access-control-request-headers": "X-Application-Key",
      "user-agent": "Mozilla/5.0 (darwin) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/11.12.0",
      "host": "<my host goes here>",
      "content-length": 0
  }
}

Я знаю, что это как-то связано с запросом OPTIONS, но я не знаю, как обойти эту проблему.

Я пытался использовать методы .matchHeader() следующим образом:

myAPI
  .get("/app.php")
  .matchHeader("Accept", () => true)
  .matchHeader("X-Mashape-Key", () => true)
  .query(({url}) => url === "http://some/url")
  .replyWithFile(200, path.resolve(__dirname, "my-response.json"), {
    "Content-Type": "application/json",
  });

Но это ничего не меняет.

1 Ответ

0 голосов
/ 18 октября 2018

Я нашел решение.Это не имеет ничего общего с Nock.Это была проблема на конце Axios.Оказалось, что я должен использовать адаптер axios/lib/adapters/http при вызове Axios в среде узла.

Таким образом, решение состоит в том, чтобы инициализировать Axios следующим образом:

import * as httpAdapter from "axios/lib/adapters/http";

const axios = Axios.create({
  adapter: httpAdapter,
  // Other options
});
...