You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cypress API测试报错:断言无法找到'infected'属性问题求助

解决Cypress文件扫描API测试的断言失败问题

嘿,我碰到过类似的坑!你的测试失败核心原因是手动设置的请求头干扰了Cypress自动处理multipart请求,导致服务器没法正确解析你上传的文件,最终返回了空响应,所以response.body变成了{},断言自然找不到infected属性。

问题根源解释:

当你用FormData作为请求体时,Cypress会自动生成正确的multipart/form-data请求头——这个头里包含了必不可少的boundary分隔符(用来区分表单里的不同部分)。但你手动设置了headers: { 'content-type': 'multipart/form-data' },这会覆盖Cypress自动生成的头,直接删掉了boundary参数。服务器收到请求后,没法识别表单结构,就无法处理你的文件上传,只能返回空响应。

修复步骤:

  1. 移除手动设置的请求头:删掉cy.request里的headers配置项,让Cypress自动处理请求头。
  2. 添加状态码检查(可选但推荐):先确认请求返回了200状态码,确保服务器成功处理了请求。

修改后的测试代码:

describe("Testing the result after scanning file", () => { 
  it("Scan file", function () { 
    const fileName = 'example.json'; 
    cy.fixture(fileName, 'binary') 
      .then((file) => Cypress.Blob.binaryStringToBlob(file)) 
      .then((blob) => { 
        const formData = new FormData(); 
        formData.append("file", blob, fileName); 
        cy.request({ 
          method: 'POST', 
          // 移除手动设置的content-type头,让Cypress自动处理
          body: formData, 
          url: '/scan' 
        }).then(response => { 
          // 先验证请求是否成功
          expect(response.status).to.eq(200);
          console.log('完整响应信息: ', response);
          console.log('响应体: ', response.body); 
          expect(response.body).to.have.property('infected').and.eq(false); 
        }); 
      }) 
  }); 
});

额外排查技巧:

如果修复后还是有问题,可以打开浏览器控制台查看完整的response对象,重点看:

  • response.status:确认是200或其他成功状态码
  • response.headers['content-type']:确认服务器返回的是application/json,如果不是,你可能需要手动解析响应体:
    const parsedBody = JSON.parse(response.body);
    expect(parsedBody).to.have.property('infected').and.eq(false);
    

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:52:35