赛普拉斯:使用三种不同的响应对同一路线进行存根响应

问题描述 投票:4回答:3

我在应用程序中有一个端点。我们在每个请求中使用params中的不同操作来达到相同的api。

网址

/application/api

样本请求有效负载1:

{
  "action":"CARD_TRANSACTION_HISTORY",
  "data":{"date_from":"2018-12-01","date_to":"2018-12-31","total":5},
  "meta":{}
}

样本请求有效负载2:

{
  "action":"CARD_BALANCE",
  "data":{"date_from":"2018-12-01","date_to":"2018-12-31","total":5},
  "meta":{}
}

样品申请有效负载3:

{
  "action":"CURRENCY_RATES",
  "data":{"date_from":"2018-12-01","date_to":"2018-12-31","total":5},
  "meta":{}
}

上述请求中的操作针对不同请求进行更改。

加载仪表板页面时,我们会使用不同的操作触发3个并发的AJAX POST请求。

柏树的问题是你只能为一条路线指定一个响应,而处理这个问题的其他方法就是顺序请求(我们不能这样做)

即使我们将响应写为函数,它也只被调用一次。

关于我们如何在有效载荷的基础上模拟数据的任何想法?

javascript ui-automation cypress
3个回答
3
投票

我有完全相同的问题,发现@Richard Matsen的答案非常有用,但是当使用whitelist选项时,无法访问返回proxy.requestundefined。但是如果你使用onRequest而不是whitelist,你可以访问请求,从而根据请求的主体实现任何操作。

所以这应该工作:

cy.server({
  onRequest: (xhr) => {
    xhr.url = xhr.url + 
      xhr.request.body.action  == 'CARD_TRANSACTION_HISTORY' ? '?transactionHistory'
      : xhr.request.body.action  == 'CARD_BALANCE' ? '?balance'
      : xhr.request.body.action  == 'CURRENCY_RATES' ? '?currencyRates'
      : ''
  }
})

2
投票

我做了一个肮脏的工作,我不喜欢它,但我没有选择。

我简单地将所有响应组合在同一个响应中。

我的模拟回应

{
  balance: {..},
  transactionHistory: {..},
  currencyRates: {..}
}

每个响应处理程序只处理它感兴趣的部分,如果其中一个响应是数组,我们需要将它更改为一个对象。

我会留意一个更好的工作。


1
投票

这是另一个黑客。它依赖于你的api忽略url参数,并且在发出请求之前调用cy.server白名单函数。

cy.server({
  whitelist: (proxy) => {
    proxy.url = proxy.url + 
      proxy.request.body.action  == 'CARD_TRANSACTION_HISTORY' ? '?transactionHistory'
      : proxy.request.body.action  == 'CARD_BALANCE' ? '?balance'
      : proxy.request.body.action  == 'CURRENCY_RATES' ? '?currencyRates'
      : ''
  }
})

const apiMocks = {
  balance: {..},
  transactionHistory: {..},
  currencyRates: {..}
}
cy.route('/application/api?balance', apiMocks.balance).as('balance')
cy.route('/application/api?transactionHistory', apiMocks.transactionHistory)
  .as('transactionHistory')
cy.route('/application/api?currencyRates', apiMocks.currencyRates).as('currencyRates')

cy.visit(...)

cy.wait('@balance').then(xhr => //should see correct mock here )
© www.soinside.com 2019 - 2024. All rights reserved.