Cypress API测试中如何正确传递form-data格式请求体?
Cypress 处理form-data 请求体的问题及解决方法
问题描述
我在Postman中有一个form-data格式的请求体,需要使用Cypress对该API端点进行自动化测试。当前编写的测试代码如下:
let doc_orderId = null; let documentNumber = 'AVBBBBB3'; cy.fixture('onFileDocPost').then(onFileDocPost => { doc_orderId = onFileDocPost.doc_orderId; cy.request({ method: 'POST', url: url + onFileUrl + onFilePostUrl, auth: { 'bearer': Cypress.env('token') }, headers: { Authorization: 'Bearer token' }, form: true, body: { OrderId : 11822104127, RawResponse: 'cypress/fixtures/TestFile.png', SearchQuery: {documentNumber}, ExtractionDateUtc: "2023-06-09T06:22:00Z" } })
但不确定传递form-data的方式是否正确,尽管请求体中已包含对应字段,仍出现报错。请问该字段是否需要特定格式?希望得到解决方法。
解决方法
你的代码存在几个关键问题,以下是修正方案:
1. 移除重复的Authorization配置
同时使用auth.bearer和headers.Authorization会导致冲突,后者还写死了无效的token字符串。建议保留auth配置,它会自动生成正确的Authorization请求头,删除冗余的headers配置即可。
2. 正确处理文件上传字段
form-data中的文件不能直接传路径字符串,需要将文件转为Blob格式后传入。使用cy.fixture读取文件二进制内容,再通过Cypress.Blob转换为Blob对象。
3. 调整SearchQuery字段格式
如果后端期望该字段是JSON格式的字符串,需要用JSON.stringify()将对象转为字符串;如果是普通字符串参数,直接传documentNumber即可。
修正后的完整代码
let documentNumber = 'AVBBBBB3'; cy.fixture('onFileDocPost').then(onFileDocPost => { // 读取目标文件并转为Blob格式 cy.fixture('TestFile.png', 'binary').then(fileBinary => { return Cypress.Blob.binaryStringToBlob(fileBinary, 'image/png'); }).then(fileBlob => { cy.request({ method: 'POST', url: `${url}${onFileUrl}${onFilePostUrl}`, auth: { bearer: Cypress.env('token') }, form: true, body: { OrderId: 11822104127, // 传入转换后的Blob文件对象 RawResponse: fileBlob, // 根据后端需求选择是否转为JSON字符串 SearchQuery: JSON.stringify({ documentNumber }), ExtractionDateUtc: "2023-06-09T06:22:00Z" } }).then(response => { // 可添加断言验证请求结果 expect(response.status).to.eq(200); }); }); });
额外注意事项
- 确认
TestFile.png确实存在于cypress/fixtures目录下,路径无误。 - 如果文件类型不是PNG,要修改
binaryStringToBlob的第二个参数(MIME类型),比如JPG文件用image/jpeg。 - 若报错仍存在,检查后端返回的具体错误信息,确认字段名、数据类型是否与接口文档完全匹配。
内容的提问来源于stack exchange,提问作者grumpypig
相关产品推荐
相关产品推荐

