Cypress: ответ заглушки для одного и того же маршрута с тремя разными ответами - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть одна конечная точка в приложении.Мы используем один и тот же API для каждого запроса с различными действиями в параметрах.

URL

/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-запросов с различными действиями.

Проблема с кипарисами заключается в том, что вы можете указать только один ответ для маршрута, а другой способ справиться с этим - сделать последовательные запросы (что мы не можем сделать)

Даже если мы напишем ответ как функцию, он вызывается только один раз.

Есть идеи о том, как мы можем имитировать данные на основе полезной нагрузки?

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Вот еще один взлом.Он полагается на то, что ваш 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 )
0 голосов
/ 17 декабря 2018

У меня была та же проблема, и я нашел ответ @Richard Matsen очень полезным, однако при использовании опции whitelist невозможно получить доступ к proxy.request, который возвращает undefined.Но если вы используете 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'
      : ''
  }
})
0 голосов
/ 06 декабря 2018

Я сделал одну грязную работу, которая сработала, мне это не понравилось, но у меня нет выбора.

Я просто объединил все ответы в одном ответе.

Мой макетОтвет

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

Каждый обработчик ответа просто обрабатывает интересующую его часть. Если один из ответов является массивом, нам нужно изменить его на объект.

Я будубыть в поисках лучшей работы вокруг.

...