Javascript CypressIO发出一个请求,然后使用响应传递给另一个函数调用另一个请求,封装在一个可重用函数中

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',

所以我的问题是,我希望能够调用一个模块函数,然后调用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.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将具有您的响应主体。之后,如果您想再次调用它,它将用新的响应替换先前的响应。如果你不再打电话给它,它仍然会有你的反应体。