#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. Привет, исходный запрос работает. Я намеренно не раскрыл весь запрос по соображениям конфиденциальности, но спасибо, что проверили тебя.