Tom*_*Tom 6 javascript asynchronous cypress
编辑:为什么这不是重复的:因为Cypress,只是读取而不是将所有内容标记为重复。
编辑 2:另外,请参阅答案以更好地理解通常的异步for循环问题与此问题之间的差异。
我正在编写 cypress 测试,我想创建一个 cypress 命令,用用户列表填充我的数据库。我希望创建循环在移动到下一个用户之前等待每个用户被创建(因为我希望以特定顺序完成)。
现在,我的循环如下所示:
Cypress.Commands.add("populateDb", (users) => {
var createdItems = []
for (const user of users) {
cy.createUser(user, 'passe').then(response => {
createdUsers.unshift(response.body.user)
})
}
return createdItems
})
Run Code Online (Sandbox Code Playgroud)
当然,这个循环在移动到下一个用户之前不会等待每个用户被创建(我想要“顺序处理”,而不是“并行然后等待所有承诺解决”)
我在这里阅读了有关异步 for 循环的答案:
但我似乎找不到我想要的东西,主要是因为 cypress 不允许我将我的函数声明为异步,如下所示:
Cypress.Commands.add("populateDb", async (users) => {
//Some code
})
Run Code Online (Sandbox Code Playgroud)
如果我不声明它,async我将无法使用await.
是不是有一些get()方法之王只是同步等待 Promise 解决?
事实证明,赛普拉斯对等待异步方法解析可以做的事情如此严格是有原因的:它总是自动按顺序运行所有异步命令,因为它们被调用,而不是并行,所以这将执行即使是 Async 也是正确的顺序createUser:
Cypress.Commands.add("populateDb", (users) => {
for (const user in users) {
cy.createUser(user).then(response => {
console.log(response)
})
}
})
Run Code Online (Sandbox Code Playgroud)
如果您想获取返回值(在我的例子中,我需要用户 ID 以便稍后删除它们),您可以将它们存储在var文件根级别并添加一个返回该 var 的 cypress 命令。
var createdItems = []
Cypress.Commands.add("getCreatedItems", () => {
return createdItems
})
Cypress.Commands.add("populateDb", (users) => {
for (const user in users) {
cy.createUser(user).then(response => {
createdItems.unshift(response) // I unshift() because I need to delete them in FILO order later
})
}
})
Run Code Online (Sandbox Code Playgroud)
然后在 cypress 测试文件中,您可以按照需要执行的顺序调用它们:
cy.populateDb(users)
cy.getCreatedItems().then(response => {
//response is my createdItems Array, and cy.getCreatedItems() will run only when cy.populateDb() is resolved
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5570 次 |
| 最近记录: |