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

Node.js 如何断言应用程序通过POST请求向API服务器发送正确的数据,node.js,reactjs,testing,axios,axios-mock-adapter,Node.js,Reactjs,Testing,Axios,Axios Mock Adapter,我正在编写React.js应用程序,与API服务器对话。我已经阅读了大量关于如何模拟这些调用并从API发送一些虚假响应的文章。我可以使用@testing library/react进行测试,我可以使用axios模拟适配器轻松模拟axios,并使用HTTP GET方法测试获取请求。但我找不到任何地方可以确保我的应用程序在发送POST请求时向API发送正确的数据,也就是说,我的应用程序发送json负载,例如“id”字段或“name”字段设置为“abc”,或类似的内容 我是React.js的新手。请建

我正在编写React.js应用程序,与API服务器对话。我已经阅读了大量关于如何模拟这些调用并从API发送一些虚假响应的文章。我可以使用@testing library/react进行测试,我可以使用axios模拟适配器轻松模拟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\u 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,
      },
    );
  });
});

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

为了满足您的需要,我将使用斯威格及其工具。你可以一石三鸟:

  • 具有适当的API文档:
  • 保护后端:确保输入/输出有效,并在客户端发送错误数据时引发详细异常:
  • 保护前端:使用客户端api生成来生成客户端使用的js类。。这样,他们就不会随意手动创建对象并将其发送到服务器(交叉手指),而是使用一个带有setter的专用API:

这样,您就拥有了一个坚如磐石的前端+后端+文档组合。

为了满足您的需要,我将使用Swagger及其工具。你可以一石三鸟:

  • 具有适当的API文档:
  • 保护后端:确保输入/输出有效,并在客户端发送错误数据时引发详细异常:
  • 保护前端:使用客户端api生成来生成客户端使用的js类。。这样,他们就不会随意手动创建对象并将其发送到服务器(交叉手指),而是使用一个带有setter的专用API:

这样,您就拥有了一个坚如磐石的前端+后端+文档组合。

好主意。但问题是关于如何编写测试:-)我几乎只回答了“我如何确保我(或其他开发人员)没有输入错误,并且没有在请求的负载中使用“userId”而不是“user_id”?它回答了这个问题:DGood idea。但问题是关于如何编写测试:-)我几乎只回答了“如何确保我(或其他开发人员)没有输入错误,并且没有在请求的有效负载中使用“userId”而不是“user_id”它回答了这个问题:我发现当使用axios mock adapter时,这样做就足够了:
axiosMock=new MockAdapter(REST_API);onPost('doSomething',{user_id:'uid1',something:'blablabla'})然后
expect(axiosMock.history.post.length)
是的,您可以使用它,但使用jest.mock时,您与所使用的技术无关(例如,如果有一次您决定使用与axios不同的技术),我发现在使用axios mock adapter时,这样做就足够了:
axiosMock=new MockAdapter(REST_API);onPost('doSomething',{user_id:'uid1',something:'blablabla'})然后
expect(axiosMock.history.post.length)是的,您可以使用它,但使用jest.mock时,您与所使用的技术无关(例如,如果您决定使用与axios不同的技术)