如何断言应用程序使用 POST 请求向 API 服务器发送正确的数据

Posted

技术标签:

【中文标题】如何断言应用程序使用 POST 请求向 API 服务器发送正确的数据【英文标题】:How to assert that app sends correct data to API server with POST request 【发布时间】:2020-05-23 11:40:17 【问题描述】:

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

我是 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是axios实例。

我如何确保我(或其他开发人员)没有打错字,也没有在请求的负载中输入“userId”而不是“user_id”?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我发现在使用 axios 模拟适配器时这样做就足够了:axiosMock = new MockAdapter(REST_API); axiosMock.onPost('doSomething', user_id: 'uid1', something: 'blabla' ).reply(200); 然后expect(axiosMock.history.post.length).toEqual(1); 是的,您可以使用它,但是使用 jest.mock 您与所使用的技术无关(例如,如果有一次您决定使用与 axios 不同的东西)【参考方案2】:

为了您的需要,我会使用 Swagger 及其工具。你会用一块石头杀死三只鸟:

拥有适当的 API 文档:https://swagger.io/tools/swagger-ui/ 保护后端:确保输入/输出有效,并在客户端发送错误数据时抛出详细异常:https://github.com/cdimascio/express-openapi-validator-example 保护前端:使用客户端 api 生成来生成客户端使用的 js 类。这样他们就不会手动创建对象并将它们发送到服务器(交叉手指),而是使用带有 setter 的专用 API:https://github.com/swagger-api/swagger-codegen

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

【讨论】:

好主意。但问题是关于如何编写测试:-) 我几乎只有红色“我怎样才能确保我(或其他一些开发人员)没有打错字并且没有在有效负载中输入“userId”而不是“user_id”要求?”它回答了它:D

以上是关于如何断言应用程序使用 POST 请求向 API 服务器发送正确的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ReactJS Web 应用程序向 Django API 发送 POST 请求?

如何使用 Angular2 向外部 API 发出 POST 请求?

在 PathParam 中使用 PathSegment 测试 POST 请求时断言失败

确定从移动应用到 API 的 Post 请求的加密算法

使用 Angular 2 向 API 发出 POST 请求时出错

向Tomcat发送POST请求时如何解决浏览器中的Javascript fetch API错误?