#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 будет ваше тело ответа. После этого, если вы захотите вызвать это снова, он просто заменит предыдущий ответ на новый. И если вы не вызовете ее снова, у нее все равно будет ваше тело ответа.