Node.js 如何断言应用程序通过POST请求向API服务器发送正确的数据
我正在编写React.js应用程序,与API服务器对话。我已经阅读了大量关于如何模拟这些调用并从API发送一些虚假响应的文章。我可以使用@testing library/react进行测试,我可以使用axios模拟适配器轻松模拟axios,并使用HTTP GET方法测试获取请求。但我找不到任何地方可以确保我的应用程序在发送POST请求时向API发送正确的数据,也就是说,我的应用程序发送json负载,例如“id”字段或“name”字段设置为“abc”,或类似的内容 我是React.js的新手。请建议如何进行测试,以确定应用程序发送给API的内容。可能吗 假设我有一个名为doSomething的函数,如下所示,只需单击某个按钮即可调用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的新手。请建
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不同的技术)