首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理单个API调用的多个API调用

处理单个API调用的多个API调用
EN

Stack Overflow用户
提问于 2022-08-01 16:14:54
回答 1查看 915关注 0票数 1

在我的团队中,我们正在尝试为业务逻辑实现一个非常常见的操作的命令,但我在处理它的实现时遇到了问题。基本上:

  1. 我们必须检索对象的数组 (GET).

对于每个对象,我们必须在其father.中检索(获取)另一个对象的

对于每个子对象(

  1. ),我们必须检查条件,如果它是我们想要的条件,我们将检索子对象,否则我们将传递null.

Q:如何处理依赖于单个API调用而不超出CY链的多个API调用?

这是我目前的实现(不起作用,但有点解释了想要的逻辑)

代码语言:javascript
复制
Cypress.Commands.add('myCommand', (sumCriteria: Function, anotherCriteria: Function) => {
    // I only retrieve fathers with certain criteria
    return cy.request('GET', fathersUrl).its('body').then(fatherObjects => {
        return fatherObjects.filter(father => father.childs.length && father.childs.find(sumCriteria))
    }).then(filteredFathers => {
        filteredFathers.forEach(father => {
            // For each father I retrieve a single child
            const targetChildId = father.childs.find(sumCriteria).id;
            // For each single child I retrieve its data and evaluate if it has the needed criteria
            cy.request('GET', `${childsUrl}/${targetChildId}`)
                .its('body')
                .then(property => anotherCriteria(property))
        })
    });
})

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-01 23:42:05

您几乎有正确的模式,但是不是返回结果,而是将它们放到队列中。

Cypress做了两件事来使这个工作

  • 在自定义命令中,它等待任何异步命令来解析
  • ,它返回队列中最后一个计算值

中的任何内容。

代码语言:javascript
复制
Cypress.Commands.add('myCommand', (sumCriteria, anotherCriteria) => {

  cy.request('GET', fathersUrl)
    .its('body')
    .then(fatherObjects => {

      const filteredFathers  = fatherObjects.filter(father => {
        return father.childs.find(sumCriteria)
      });

      const results = []
      filteredFathers.forEach(father => { 
        cy.request('GET', father)              // waits for all these to resove
          .its('body')
          .then(property => anotherCriteria(property))   
      })

      cy.then(() => results)                   // returns this last queued command
  })
})

可复制的例子:

代码语言:javascript
复制
Cypress.Commands.add('myCommand', (sumCriteria, anotherCriteria) => {

  const fathersUrl = 'https://jsonplaceholder.typicode.com/todos/1'

  cy.request('GET', fathersUrl)
    .then(() => {

      // simulated url extraction
      const filteredFathers = [
        'https://jsonplaceholder.typicode.com/todos/2', 
        'https://jsonplaceholder.typicode.com/todos/3'
      ]

      const results = []
      filteredFathers.forEach(father => { 
        cy.request('GET', father)
          .then(res => {
            results.push(res.body.id)
          })
      });

      cy.then(() => results)
  });
})

cy.myCommand()
  .should('deep.eq', [2,3])             // ✅ passes
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73196683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档