【问题标题】:How to wait for particular response data that is intercepted in cypress tests如何等待在 cypress 测试中截获的特定响应数据
【发布时间】:2021-07-13 12:46:59
【问题描述】:

我在一个页面上有一个复杂的计算服务,点击“计算”按钮就会触发它。这将触发需要 10-30 秒的服务,因此将每 2 秒发出一次 GET 请求,除非响应在 JSON 响应中包含“calculatedRoute”数据。然后我必须根据 calculatedRoute 数据验证 UI

到目前为止,我在 Cypress 中进行了以下测试

  cy.intercept("GET", "/v1/calculations/*").as("route-calculations")
  cy.get('#calc').click();
  cy.waitForCalculationRequest('@route-calculations', 30)

在命令中,

Cypress.Commands.add("waitForCalculationRequest", (aliasName, retries) => {
  cy.wait(aliasName).its('response.body').then(json => {
    cy.log(typeof json)
    cy.log(json);
    cy.log(json.calculatedRoute);
    if (json.calculatedRoute == "") {
      return
    } 
    else if (retries > 0) {
      cy.waitForCalculationRequest(aliasName, retries - 1);
    } 
  });
});

但我无法让命令在抛出时正常工作

任何帮助将不胜感激。

在计算过程中获取响应数据(除最后一个之外的所有请求):

{
  "id": 8,
  "createdAt": "2021-07-13T11:39:11.756095Z",
  "updatedAt": "2021-07-13T11:39:11.756095Z",
  "status": "pending",
}

GET 计算完成时的响应数据(Last request):

{
  "id": 8,
  "createdAt": "2021-07-13T11:39:11.756095Z",
  "updatedAt": "2021-07-13T11:39:41.394267Z",
  "status": "complete",
   "calculatedRoute": {
    "route": "bla bla bla",
    "subscriptions": [
      x,y,z
    ],
    }
}

【问题讨论】:

    标签: cypress


    【解决方案1】:

    看起来你快到了,但是json.calculatedRoute 在请求 #33 上是空的,并且在请求 #34 上有一个对象,所以它只是 if() 语句,有点像 @ocyoplus 在 cmets 中所说的,但是强一点

    if (typeof json.calculatedRoute === 'object') {    // found
      return json.calculatedRoute.route
    } 
    else if (retries > 0) {
      cy.waitForCalculationRequest(aliasName, retries - 1);
    } 
    

    或者

    if (json.status === 'complete') {    // found
      return json.calculatedRoute.route
    } 
    else if (retries > 0) {
      cy.waitForCalculationRequest(aliasName, retries - 1);
    } else {
      // fail the test
      throw 'Status "complete" never occurred'  
    }
    

    【讨论】:

    • 谢谢,您能否在回答中详细说明如何从该对象读取数据?我希望它是一个 JSON,但它返回一个对象。
    • 对象是 JSON(反之亦然)。我不确定你在找什么。你只需要return json.calculatedRoute吗?我猜你正在寻找显示{ "route": "bla bla bla" }的位?
    • 是的,没错。我想阅读 { "route": "bla bla bla" } 以验证 UI
    • 由于您在最终回复中有"status": "complete",这可能是一个更好的检查,即if (json.status === 'complete') { return json.calculatedRoute.route } else ...
    • 我还在想另一个 else 在重试次数 = 0 时处理失败。
    【解决方案2】:

    我不知道这种递归是否可行,但看起来你在waitForCalculationRequest(aliasName, retries - 1); 之前忘记了cy. 所以它应该是这样的:

    Cypress.Commands.add("waitForCalculationRequest", (aliasName, retries) => {
      cy.wait(aliasName).its('response.body').then(json => {
        if (json.calculatedRoute == "") {
          return
        } 
        else if (retries > 0) {
          cy.waitForCalculationRequest(aliasName, retries - 1);
        } 
      });
    });
    

    【讨论】:

    • 谢谢,我错过了更新那个,更新了我的问题。
    • 好的,我在想的另一件事是这个片段if (json.calculatedRoute == "")。如果你想检查 json.calculatedRouse 是否存在,这应该看起来像这样 if (json.calculatedRoute !== null")if (json.calculatedRoute !== undefined )
    • 谢谢@octoplus
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多