Cypress: как мне передать выбранное свойство из ответа API другому запросу API?

#cypress

#cypress

Вопрос:

Я хотел бы использовать Cypress для тестирования API. Моя цель — извлечь часть ответа API и передать ее другому запросу API. Вот пример кода:

 Cypress.Commands.add('createCustomer', () => {
    return cy.request({
        method: 'POST',
        url: 'api/v1/Customers',
        headers: {
            'Content-Type': 'application/json'
        },
        body: {
            // sample content
        }
    }).then((response) => {
        return new Promise(resolve => {        
            expect(response).property('status').to.equal(201)
            expect(response.body).property('id').to.not.be.oneOf([null, ""])
            const jsonData = response.body;
            const memberId = jsonData.id
            resolve(memberId)
            return memberId
        })
    })
})
 

С помощью этого кода я получаю [object Object] в качестве результата. введите описание изображения здесь

Надеюсь на обратную связь.

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

1. Не могли бы вы также упомянуть, как вы используете значение из API 1 в API 2, так как в примере я вижу только один запрос?

Ответ №1:

Итак, вы добавляете идентификатор, сгенерированный the POST , в последующий GET запрос?

Попробуйте вернуть идентификатор без использования Promise, я не думаю, что он вам нужен в этот момент, поскольку ответ уже поступил.

 }).then((response) => {
  expect(response).property('status').to.equal(201)
  expect(response.body).property('id').to.not.be.oneOf([null, ""])
  const jsonData = response.body;
  const memberId = jsonData.id;
  return memberId;
})
 

Url для получения

 cy.createCustomer().then(id => {
  const url = `api/v1/Customers${id}`;
  ...
 

или

 cy.createCustomer().then($id => {
  const id = $id[0];       // Not quite sure of the format, you may need to "unwrap" it
  const url = `api/v1/Customers${id}`;
  ...
 

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

1. Это полностью сработало! Большое спасибо, Марион! 🙂

Ответ №2:

Если вы хотите передать ответ из запроса API 1 в запрос API 2, вы можете сделать что-то вроде этого:

 describe('Example to demonstrate API Chaining in Cypress', function () {

    it('Chain two API requests and validate the response', () => {
        //Part 1
        cy.request({
            method: 'GET',
            url: 'https://www.metaweather.com/api/location/search/?query=sn',
        }).then((response) => {
            const location = response.body[0].title
            return location
        })
            //Part 2
            .then((location) => {
                cy.request({
                    method: 'GET',
                    url: 'https://www.metaweather.com/api/location/search/?query='   location
                }).then((response) => {
                    expect(response.status).to.eq(200)
                    expect(response.body[0]).to.have.property('title', location)
                })
            })
    })
})
 

Ответ №3:

Похоже, что ваш код дает сбой во время первоначального запроса, а не во время последующих действий. Я далек от эксперта по Javascript, но у вас, похоже, есть какая-то ненужная сложность. Попробуйте упростить свою команду следующим образом и посмотрите, сможете ли вы, по крайней мере, выполнить успешный запрос:

 Cypress.Commands.add('createCustomer', () => {
    cy.request({
        method: 'POST',
        url: 'api/v1/Customers',
        headers: {
            'Content-Type': 'application/json'
        },
        body: {
            // sample content
        }
    })
})
 

И если это сработает, продолжайте:

 Cypress.Commands.add('createCustomer', () => {
    cy.request({
        method: 'POST',
        url: 'api/v1/Customers',
        headers: {
            'Content-Type': 'application/json'
        },
        body: {
            // sample content
        }
    }).then((response) => {      
        expect(response).property('status').to.equal(201)
        expect(response.body).property('id').to.not.be.oneOf([null, ""])
        const jsonData = response.body;
        const memberId = jsonData.id
        return memberId
    })
})
 

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

1. Привет, исходный запрос работает. Я намеренно не раскрыл весь запрос по соображениям конфиденциальности, но спасибо, что проверили тебя.