сбой вызова исправления запроса cypress для локального сервера-заглушки

#automation #integration-testing #cypress #e2e-testing #stubbing

Вопрос:

У меня есть локальный сервер-заглушка, на котором есть запрос на ИСПРАВЛЕНИЕ. Когда я вызываю эту локальную конечную точку внутри cypress, она выходит из строя. Мой кипарисовый код

 Cypress.Commands.add('callLocalAPI', (id: string = '1') => {
  const options = {
    method: 'PATCH',
    url: `${Cypress.env().baseUrl}test/api`,
    // failOnStatusCode: false,
    retryOnStatusCodeFailure: true,
    log: true,
    body: {
      id,
    },
  }

  // we need cy to visit the current URL so it grabs cookie
  // for our request
  cy.visit('/')
  cy.request(options).then((response) => {

    if (!String(response.body.id)) {
      console.error(response)
      throw Error(`Fail to get response with ${id}`)
    }
  })
})
 

затем вызовите эту пользовательскую команду cypress

 cy.callLocalAPI('2')
 

Когда я получаю доступ к этой конечной точке с помощью postman (http://localhost:8882/test/api), я получаю ожидаемый ответ с кодом состояния 200, поэтому проблем с макетом сервера нет.

Но когда я провожу тесты cypress, я всегда получаю 404.

 Status: 404 - Not Found
Headers: {
  "server": "stubby/5.0.0 node/v12.19.0 (darwin x64)",
  "date": "Fri, 03 Sep 2021 03:36:49 GMT",
  "connection": "keep-alive",
  "keep-alive": "timeout=5",
  "transfer-encoding": "chunked"
}
 

Ответ №1:

Попробуй

   const options = {
    method: 'PATCH',
    url: 'test/api',
    ...
 

Из документов Cypress — запрос

Если вы делаете запрос cy. () после посещения страницы, Cypress предполагает, что URL-адрес, используемый для посещения cy. (), является хостом.
cy.visit('http://localhost:8080/app')
cy.request('users/1.json') // url is http://localhost:8080/users/1.json

Возможно, в этой строке просто отсутствует разделитель путей

 url: `${Cypress.env().baseUrl}test/api`
 

Cypress.env().baseUrl

Обратите внимание, что значение для этой строки равно

  • взято из файла cypress.env.json (нет cypress.json )
     {
       "baseUrl": "http://localhost:8882/" 
    }
     
  • или переопределено в командной строке
    cypress open --env baseUrl=http://localhost:8882/

Комментарии:

1. нет возврата baseurl — localhost:8080 , поэтому для URL-адреса не требуется разделитель путей

2. Почему разделитель путей не требуется? Если baseUrl соответствует вашим словам, URL — адрес вашего запроса, который вы используете, будет localhost:8080test/api -но так и должно быть localhost:8080/test/api .

3. baseUrl возвращает локальный хост:8080 / (обратите внимание на последнюю обратную косую черту)

4. В комментарии удалена обратная косая черта

5. И я отмечаю, что здесь вы говорите порт 8080, но выше с почтальоном вы используете порт 8882. Что это дает?