如何在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
相关产品推荐
相关产品推荐

