Тестирование кода состояния 400 axios выдает ошибку

Я создаю тестовую среду API для проекта, над которым я работаю, и я хочу проверить обязательные поля в объектах JSON, отправляемых в конечную точку.

Я пытаюсь отправить объект JSON с отсутствующим полем и ожидаю ответа 400 от моего приложения с сообщением проверки. Но при выполнении этого вызова с помощью axios он (несколько правильно) выдает ошибку, поскольку получил 400.

Я хочу иметь возможность утверждать, что ожидается 400, и утверждать сообщение проверки.

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

Кажется, я не мог найти никого, кто пытался бы это сделать.

async function createReminder(reminderObject) {
  const response = await axios.post(`${config.get('baseUrl')}/reminder`, {
    ...reminderObject
  });

  return response;
}

module.exports.createReminder = createReminder;

Вот мой рабочий код в его нынешнем виде. Это сделает действительным 200 при использовании с действительным вызовом.

Мне нужно, чтобы сообщение ответа/проверки 400 возвращалось в объекте ответа для обработки в функции, которая вызывает эту функцию.


person Kpizzle    schedule 30.08.2019    source источник


Ответы (1)


По сути, вы хотите перехватить ответ и преобразовать его по своему усмотрению. В документации axios есть раздел , посвященный перехватчикам. В качестве примера того, что вы можете с ним сделать, вот что я использовал в недавнем проекте с серверной частью Laravel:

axios.interceptors.response.use(
  res => Promise.resolve(res.data),
  error => {
    let message = null;
    if (error.response) {
      // if error has a data.error property, it's an error formatted by server
      if (error.response.data.error) message = error.response.data.error;
      else if (error.response.status === 500) message = 'Oops! Something went wrong.';
    } else {
      // if error has a code property, it's an error defined by axios
      if (error.code === 'ECONNABORTED') message = 'Timeout exceeded';
      else message = 'Oops! Something went wrong.';
    }
    // eslint-disable-next-line prefer-promise-reject-errors
    return Promise.reject({ error: message });
  }
);

Приведенный выше код позволяет мне выполнять вызовы axios следующим образом и всегда ожидать один и тот же формат:

axios.post('/url', { data: { ... }})
  .then(({ jsonProp1 }) => console.log(jsonProp1))
  .catch(({ error }) => console.log(error);

Примечание. если вы создаете новый экземпляр axios, вам также необходимо повторно внедрить перехватчик ответа для этого экземпляра.

person Tyblitz    schedule 31.08.2019
comment
Спасибо. Я видел это в документах, но не очень понимаю, как это реализовать. Где разместить код перехватчика? - person Kpizzle; 31.08.2019
comment
@Kpizzle сразу после импорта axios, чтобы вы могли быть уверены, что все последующие вызовы AJAX будут использовать его. Например. Я обычно создаю файл api.js и помещаю туда этот код - person Tyblitz; 31.08.2019
comment
Таким образом, добавление после оператора require означает, что перехватчики будут вызываться до того, как будут сделаны какие-либо вызовы API. Но как мне тогда вызвать этот код, если он у меня есть в другом файле, как вы предлагаете, что выглядит как правильный путь? - person Kpizzle; 31.08.2019
comment
Вам не нужно вызывать его явно. Вы просто импортируете axios куда угодно (он экспортирует экземпляр по умолчанию, и вы зарегистрировали на нем перехватчик, поэтому он будет автоматически выполняться для каждого ответа на запрос). Если вы не знакомы, выполните поиск по термину промежуточное ПО, перехватчики axios работают так же, как Express js или действительно любое промежуточное ПО. - person Tyblitz; 31.08.2019
comment
Ааа, в этом есть смысл, да, я понимаю промежуточное ПО. Большое спасибо. Позвольте мне попытаться добавить это сейчас. - person Kpizzle; 31.08.2019