如何断言应用程序通过 POST 请求将正确的数据发送到 API 服务器

How to assert that app sends correct data to API server with POST request

我正在编写 React.js 与 API 服务器通信的应用程序。我已经阅读了大量关于如何模拟这些调用并从 API 发送一些虚假响应的文章。我可以使用@testing-library/react 进行测试,我可以使用 axios-mock-adapter 轻松模拟 axios 并使用 HTTP GET 方法测试获取请求。但是我无法在任何地方找到如何确保我的应用程序在发送一些 POST 请求时将正确的数据发送到 API,即我的应用程序发送 json 有效负载,例如"id" 字段,或 "name" 字段设置为 "abc",或类似这样的内容。

我是 React.js 的新手。请告知如何进行测试断言应用程序发送到 API 的内容。可能吗?

假设我有一个名为 doSomething 的函数,如下所示,通过单击某个按钮来调用。

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以上是axios实例

我如何确保我(或其他一些开发人员)没有打错字并且没有将 "userId" 而不是 "user_id" 放在有效负载中请求?

如果您必须确保正确调用 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,
      },
    );
  });
});

或者如果您使用实例,请在另一个文件中定义它 (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,
      },
    );
  });
});

根据您的需要,我会使用 Swagger 及其工具。一石三鸟:

这样你就有了一个坚如磐石的前端+后端+文档组合..