Тестирование заголовков запроса Axios - PullRequest
0 голосов
/ 11 октября 2019

Я использую Mocha + Chai и axios-mock-adapter для проверки моего запроса axios. Это работает хорошо, но я не знаю, как test headers axios с помощью axios-mock-adapter и убедиться, что Authorization и Content-type правильно!

export const uploadFile = (token: string, fileName: string, file: Buffer): Promise<string> => {
  return new Promise((resolve, reject): void => {
    const uploadFileURL = `xxxxx.com`;
    axios
      .put(uploadFileURL, file, {
        headers: {
          Authorization: `Bearer ${token}`,
          "Content-type": "application/x-www-form-urlencoded",
        },
      })
      .then((response): void => {
        resolve(response.data.id);
      })
      .catch((error: Error): void => {
        reject(error.message);
      });
  });
};

И это мой тестfunction

  describe("uploadFile", (): void => {
    let mockAxios: MockAdapter;
    beforeEach((): void => {
      mockAxios = new MockAdapter(axios);
    });

    afterEach((): void => {
      mockAxios.reset();
    });

    it("should return item's id", (done): void => {
      const fileName: string = faker.system.fileName();
      const token: string = faker.random.words();
      const file: Buffer = Buffer.from(faker.random.words());
      const expectedResult = {
        id: faker.random.uuid(),
      };
      mockAxios.onPut(`xxxxx.com`).reply(200, expectedResult, {
        Authorization: `Bearer ${token}`,
        "Content-type": "application/x-www-form-urlencoded",
      });

      uploadFile(token, fileName, file)
        .then((actualResult: string): void => {
          // I want to test my header of my requests
          expect(actualResult).to.equal(expectedResult.id);
          done(); // done make sure we know when we run the test
        })
        .catch(done);
    });
  });

Так что, если кто-нибудь знает, как написать правильный тест для запроса заголовка, пожалуйста, помогите мне. Заранее спасибо!

1 Ответ

1 голос
/ 11 октября 2019

Единственный способ получить доступ к заголовкам запросов в .reply и проверить его здесь:

mockAxios.onPut(`xxxxx.com`).reply((config) => {
  expect(config.headers."Content-Type").toEqual("What do you expect here");
  return [200, expectedResult, {
    Authorization: `Bearer ${token}`,
    "Content-type": "application/x-www-form-urlencoded",
  }];
});

На самом деле я считаю, что это также должно быть возможно декларативным способом:

mockAxios.onPut(`xxxxx.com`, undefined, { 
  expectedHeader1: "value1", 
  expectedHeader2: "value2"}
).reply(200, expectedResult);

Таким образом, было бы просто выдавать вместо возврата ложного ответа, если заголовки запроса не совпадали.

Но сейчас это не работает.

Причина: axios-mock-adapter использует deepEqual для такой фильтрации. Таким образом, нам нужно было бы указать не только несколько требуемых заголовков (на которые мы фокусируемся), но и все заголовки, включая те, которые добавляются в axios самостоятельно (например, Accept). Так что это не совсем читабельно.

У меня подано # 219 в их репо по этому вопросу. Если это не было преднамеренным по какой-либо причине, это может быть исправлено в будущем.

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