Как утверждать, что приложение отправляет правильные данные на сервер API с помощью запроса POST - PullRequest
0 голосов
/ 07 февраля 2020

Я пишу React. js Приложение разговаривает с сервером API. Я прочитал тонны статей о том, как издеваться над этими вызовами и посылать ложные ответы от API Я могу проводить тестирование с помощью @ testing-library / реагировать, я могу легко смоделировать ax ios с помощью ax ios -mock-adapter и проверить запросы на выборку с помощью метода HTTP GET. Но я нигде не могу найти, как убедиться, что мое приложение, когда оно отправляет некоторый запрос POST, отправляет правильные данные в API, то есть, что мое приложение отправляет полезную нагрузку json, например, с полем "id" или полем "name", установленным в " ab c ", или как-то так.

Я новичок в React. js. Посоветуйте, пожалуйста, как сделать тесты, утверждающие, что приложение отправляет в API. Является ли это возможным?

Допустим, у меня есть функция с именем doSomething, как показано ниже, которая вызывается с помощью onClick некоторой кнопки.

const doSomething = async (userId, something) => {
    try {
        await REST_API.post('doSomething', {
            user_id: userId,
            something: something
        });
        return true;
    } catch (error) {
        window.alert(error);
        return false;
    }
};

REST_API выше является экземпляром ax ios.

Как я могу убедиться, что я (или другой разработчик) не сделал опечатку и не поместил "userId" вместо "user_id" в полезную нагрузку запроса?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Если вам нужно быть уверенным, что вы правильно вызываете API, я бы использовал jest следующим образом:

jest.mock('axios', () => ({
  post: jest.fn(),
}));

describe('test', () => {
  it('doSomething', () => {
    const userId = 123;
    const something = 'abc';
    doSomething(userId, something);
    expect(axios.post).toBeCalledWith(
      'doSomething', {
        user_id: userId,
        something,
      },
    );
  });
});

или, если вы используете instance, определите его в другом файле ( axios_instance. js) и с использованием следующего теста:

jest.mock('./axios_instance', () => ({
  instance: {
    post: jest.fn(),
  },
}));

describe('test', () => {
  it('doSomething', () => {
    const userId = 123;
    const something = 'abc';
    doSomethingInstance(userId, something);
    expect(instance.post).toBeCalledWith(
      'doSomething', {
        user_id: userId,
        something,
      },
    );
  });
});
0 голосов
/ 13 февраля 2020

Для ваших нужд я бы использовал Swagger и его инструменты. Вы могли бы убить трех зайцев одним выстрелом:

  • Иметь соответствующую документацию API: https://swagger.io/tools/swagger-ui/
  • Защитить бэкэнд: Убедитесь, что входы / выходы действительны, и выдает подробное исключение, если клиент отправляет неверные данные: https://github.com/cdimascio/express-openapi-validator-example
  • Защита внешнего интерфейса: используйте генерацию API клиента для генерации js классов, используемых вашими клиентами. Таким образом, они не будут произвольно создавать объекты вручную и отправлять их на сервер (скрещивая пальцы), но использовать выделенный API с установщиками: https://github.com/swagger-api/swagger-codegen

Таким образом, у вас есть камень solid Frontend + Backend + документация комбинированная ..

...