Javascript CypressIO发出一个请求,然后使用响应传递给另一个函数调用另一个请求,封装在一个可重用函数中
所以我的问题是,我希望能够调用一个模块函数,然后调用cy.request()获取响应,并以一种好的方式将其反馈给另一个cy.request() 我想让这段代码变得更好:Javascript CypressIO发出一个请求,然后使用响应传递给另一个函数调用另一个请求,封装在一个可重用函数中,javascript,ecmascript-6,callback,cypress,es6-modules,Javascript,Ecmascript 6,Callback,Cypress,Es6 Modules,所以我的问题是,我希望能够调用一个模块函数,然后调用cy.request()获取响应,并以一种好的方式将其反馈给另一个cy.request() 我想让这段代码变得更好: Cypress.Commands.add('createUser', (user) => { cy.request({ method: 'POST', url: 'https://www.example.com/tokens', body: { email: 'admin_username',
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.request放在它们自己的函数中,例如getAuthToken()和createUser(),这样我就可以将它们包装在一个Cypress.Command中,或者只在测试文件中包含一个模块函数和调用
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();
}
然后在测试文件中像这样使用
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();
}
您可以使用包装第一个请求的响应,然后可以在任何地方使用它
自定义命令:
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)
您可以使用包装第一个请求的响应,然后可以在任何地方使用它
自定义命令:
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)
wrap函数是如何工作的?另一个cu命令是如何知道@getAuthToken变量的,它是放在某种全局上下文中还是什么?其次,我是否可以将这两个CY.commands放在一个名为seed user的模块函数中,这样其他开发人员就可以调用seedUser()并反过来调用这两个CY命令?是的,您是正确的,您也可以在测试文件中使用@getAuthToken,因为它现在是全局可用的。对于第二点,您的意思是要创建使用其他两个的第三个自定义命令吗?不必是自定义命令,我考虑的是s模块函数,如export const seedUser=()=>{cy.getAuthToken();cy.createUser()}另外,如果它现在可以全局访问,并且该响应永远可以访问,那么如果我再次向CY.getAuthToken()发出请求以播种其他用户等,该响应如何工作?它会导致缓存问题吗?或者包装函数或响应不在该部分之后。因此,每当您第一次调用
cy.getAuthToken()
时,getAuthTokenResponse将具有您的响应主体。之后,如果您想再次调用它,它将用新的响应替换先前的响应。如果你不再调用它,它仍然会有你的响应体。wrap函数是如何工作的?另一个cu命令是如何知道@getAuthToken变量的,它是放在某种全局上下文中还是什么?其次,我是否可以将这两个CY.commands放在一个名为seed user的模块函数中,这样其他开发人员就可以调用seedUser()并反过来调用这两个CY命令?是的,您是正确的,您也可以在测试文件中使用@getAuthToken,因为它现在是全局可用的。对于第二点,您的意思是要创建使用其他两个的第三个自定义命令吗?不必是自定义命令,我考虑的是s模块函数,如export const seedUser=()=>{cy.getAuthToken();cy.createUser()}另外,如果它现在可以全局访问,并且该响应永远可以访问,那么如果我再次向CY.getAuthToken()发出请求以播种其他用户等,该响应如何工作?它会导致缓存问题吗?或者包装函数或响应不在该部分之后。因此,每当您第一次调用cy.getAuthToken()
时,getAuthTokenResponse将具有您的响应主体。之后,如果您想再次调用它,它将用新的响应替换先前的响应。如果你不再打电话给它,它仍然会有你的反应体。