Cypress-在使用cy.intercept断言请求时遇到问题';cy.its()出错,因为您的主题上不存在属性:request;

Cypress-在使用cy.intercept断言请求时遇到问题';cy.its()出错,因为您的主题上不存在属性:request;,cypress,Cypress,我试图在请求体上断言,以确保正确的新测试卡作为订单的一部分通过 it("User clicks confirm & pay button to complete order", () => { cy.intercept("/api/checkout/payandcommit").as("placeOrder"); cy.placeOrderAndPay(); cy.wait("@place

我试图在请求体上断言,以确保正确的新测试卡作为订单的一部分通过

it("User clicks confirm & pay button to complete order", () => {
    cy.intercept("/api/checkout/payandcommit").as("placeOrder");
    cy.placeOrderAndPay();
    cy.wait("@placeOrder")
      .its("response.statusCode")
      .should("eq", 200)
      .its("request.body")
      .should("include", "cardNumber", 370000000000002);
  });
在验证状态代码之后,一切都很好,然后状态代码就会中断

这是引发的错误:

Timed out retrying: cy.its() errored because the property: request does not exist on your subject.

cy.its() waited for the specified property request to exist, but it never did.

If you do not expect the property request to exist, then add an assertion such as:

cy.wrap({ foo: 'bar' }).its('quux').should('not.exist')
如果我注释掉状态码断言,就会抛出这个新错误:被测试的对象必须是数组、映射、对象、集合、字符串或弱集,但对象是给定的


任何帮助这项工作将不胜感激

像这样链接断言是行不通的,因为主题在链中发生了变化

cy.wait(@placeOrder”)//生成拦截对象
.its(“response.statusCode”)//生成数字200
.should(“eq”,200)//产生它的输入(数字200)
.its(“request.body”)//此处不测试拦截对象
。应(“包括”,“卡号”,3700000000000002);
一种有效的方法是使用回调来获取拦截对象

cy.wait('@placeOrder')。然后(拦截=>{
console.log(拦截);//查看属性
cy.wrap(拦截.响应.状态码).should('eq',404));
cy.wrap(拦截.请求.正文)
.should(“include”,“cardNumber”,3700000000000002)//不确定是否正确
.should(“have.property”,“cardNumber”,3700000000000002)//也许这样更好
})
如果主题被维护,您也可以使用链式命令,这意味着您必须调整中间的
should()

cy.wait(“@placeOrder”)
.should('have.property','response.statusCode',200)
.should('have.property','request.body.cardNumber',3700000002);

查看记录的拦截对象,确保您具有正确的属性和属性值类型(例如,cardNumber是数字还是字符串?)。

非常感谢您的帮助Hiram K!我能够让它与以下设备一起工作:

cy.wait("@placeOrder").then((interception) => {
      console.log(interception);
      cy.wrap(interception.response.statusCode).should("eq", 200);
      cy.wrap(interception.request.body.paymentDetails[0].cardNumber).should(
        "include",
        "370000000000002"
      );
      cy.wrap(
        interception.request.body.paymentDetails[0].defaultPayment
      ).should("eq", false);
    });

从一个步骤到下一个步骤生成的主题正在改变-
cy.wait(@placeOrder”)
生成一个“拦截对象”,但是
。它的(“response.statusCode”)
生成数字200,这是
。它的(“request.body”)
看到的,不是拦截对象。@HiramK.Hackenbacker感谢您的快速回复!如果我注释掉statusCode断言,我会遇到“被测试的对象必须是数组”错误。关于如何解决此问题以及如何使statusRequest和request.body检查都起作用的任何提示?好的,可能是拦截没有
request.body
属性。您可以通过
cy.wait(@placeOrder”)。然后(interception=>console.log(interception))
来检查拦截。谢谢,这非常方便。这是注销拦截时返回的内容。请求:正文:accountRegistrationPreferences:{电子邮件:}付款详细信息:数组(1)0:billingAddress:{地址:{…},联系人信息:{…},个人信息:{…}卡号:“3700000000000002”卡号:“AmericanExpress”cvv:“7373”默认付款:假到期月份:“03”到期年份:“2030”类型:“creditCard3DS”真棒的东西,非常感谢你的帮助!我接受了答案:)