CypressIO сделать запрос, затем использовать ответ для передачи другой функции для вызова другого запроса, обернуть внутри многоразовой функции

#javascript #ecmascript-6 #callback #cypress #es6-modules

#javascript #ecmascript-6 #обратный вызов #cypress #es6-модули

Вопрос:

Итак, проблема, с которой я сталкиваюсь, заключается в том, что я хочу иметь возможность вызывать функцию модуля, которая затем вызовет cy.request(), получит ответ и передаст его другому cy.request() приятным способом.

Я хочу сделать этот код лучше:

 Cypress.Commands.add('createUser', (user) => {
  cy.request({
  method: 'POST',
  url: 'https://www.example.com/tokens',
  body: {
    email: 'admin_username',
    password: 'admin_password'
 }
}).then((resp) => {
   cy.request({
     method: 'POST',
     url: 'https://www.example.com/users',
     headers: ({ Authorization: 'Bearer '   resp.body.token }),
     body: user
  })
})
})
  

Я бы хотел, чтобы два cy.requests были в их собственных функциях, например, getAuthToken() и CreateUser() , чтобы я мог обернуть это в Cypress .Команда или просто функция модуля и вызовите в тестовом файле

 const seedUser = (userObject) => {
             getAuthToken().then((token) => {
                 return createUser(token); //where this would return the created user.
             }       
         }
  

затем используется так в тестовом файле

 before(()=>{
    let user =  seedUser();
 //or
 let user = cy.seedUser();
}
  

Ответ №1:

Вы можете использовать cy.wrap(), чтобы обернуть ответ на ваш первый запрос, а затем вы можете использовать его где угодно.

Пользовательские команды:

 Cypress.Commands.add('getAuthToken', () => {
    cy.request({
        method: 'POST',
        url: 'https://www.example.com/tokens',
        body: {
            email: 'admin_username',
            password: 'admin_password'
        }
    }).then((response) => {
        cy.wrap(response).as('getAuthTokenResponse')
    })
})


Cypress.Commands.add('createUser', (user) => {
    cy.get('@getAuthTokenResponse').then((resp) => {
        cy.request({
            method: 'POST',
            url: 'https://www.example.com/users',
            headers: ({ Authorization: 'Bearer '   resp.token }),
            body: user
        })
    })
})
  

В вашем тестовом файле вы можете просто добавить:

 cy.getAuthToken()
cy.createUser(user)
  

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

1. Как работает функция переноса? Откуда другая команда cu знает переменную @getAuthToken, помещается ли она в какой-то глобальный контекст или что-то в этом роде? Во-вторых, могу ли я затем поместить эти две команды CY.commands в модульную функцию с именем seed user , чтобы другие разработчики могли просто вызвать seedUser() и, в свою очередь, вызвать две команды cy ?

2. Да, вы правы, вы также можете использовать @getAuthToken в своем тестовом файле, поскольку теперь он доступен во всем мире. Для второго пункта вы имеете в виду, что хотите создать третью пользовательскую команду, которая использует две другие?

3. Это не обязательно должна быть пользовательская команда, я думал о функции модуля s, такой как export const seedUser = () => { cy.getAuthToken(); cy.CreateUser()}

4. Кроме того, если теперь он доступен глобально, и этот ответ доступен навсегда, как это будет работать, если я снова отправлю запрос в CY.getAuthToken() для заполнения другими пользователями и тому подобное? Вызовет ли это проблемы с кешем? Или это перенос функции или ответа, не следующего за этой частью.

5. Поэтому всякий раз, когда вы вызываете getAuthTokenResponse в первый раз cy.getAuthToken() , у getAuthTokenResponse будет ваше тело ответа. После этого, если вы захотите вызвать это снова, он просто заменит предыдущий ответ на новый. И если вы не вызовете ее снова, у нее все равно будет ваше тело ответа.