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

如何在Cypress中断言JSON响应中的多个属性?

问题原因及解决方案

核心问题

你的链式断言写法有误:第一个.should('have.property', 'accountType', 'Checking')会返回accountType的属性值(而非原body对象),后续断言是在这个字符串值上执行,自然找不到message、withdrawalCode这些属性,导致断言失败。

修正方案

以下是三种可行的解决方式,同时需要修正你代码中与服务器返回不匹配的断言内容:

方案1:使用and链式断言(推荐)

and会延续前一个断言的上下文(即body对象),而非返回属性值,适合链式断言多个属性:

cy.request({
  method: 'POST',
  url: 'http://users/bank-account/withdrawal', 
  body: {     
    name: "paul.king@asher-bank.com",
    password: "test123"
  },
  failOnStatusCode: false
}).its('body')
  .should('have.property', 'accountType', 'CHECKING') // 修正为服务器返回的全大写值
  .and('have.property', 'message', 'Your account is overdrawn') // 修正为服务器返回的正确消息
  .and('have.property', 'withdrawalCode', 'SZWW-2000-11-CD')

方案2:单个should回调内完成所有断言

通过回调函数接收body对象,使用Chai断言语法灵活验证多个字段:

cy.request({
  method: 'POST',
  url: 'http://users/bank-account/withdrawal', 
  body: {     
    name: "paul.king@asher-bank.com",
    password: "test123"
  },
  failOnStatusCode: false
}).its('body')
  .should(body => {
    expect(body.accountType).to.equal('CHECKING');
    expect(body.message).to.equal('Your account is overdrawn');
    expect(body.withdrawalCode).to.equal('SZWW-2000-11-CD');
  });

方案3:deep.equal断言整个对象

如果返回的JSON仅包含这三个字段,且需要完全匹配,可直接断言整个对象:

cy.request({
  method: 'POST',
  url: 'http://users/bank-account/withdrawal', 
  body: {     
    name: "paul.king@asher-bank.com",
    password: "test123"
  },
  failOnStatusCode: false
}).its('body')
  .should('deep.equal', {
    accountType: "CHECKING",
    message: "Your account is overdrawn",
    withdrawalCode: "SZWW-2000-11-CD"
  });

额外注意事项

你代码中存在两处与服务器返回不匹配的断言内容,必须修正才能通过:

  • accountType:服务器返回的是全大写"CHECKING",而非你写的"Checking"
  • message:服务器返回的是"Your account is overdrawn",而非你写的带引用码的消息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:48:18