Skip to main content
Cypress应用

Cypress.Promise

Cypress 自动包含 Bluebird 并将其暴露为 Cypress.Promise

用于实例化一个新的 bluebird promise。

语法

new Cypress.Promise(fn)

用法

正确用法

new Cypress.Promise((resolve, reject) => { ... })

错误用法

new cy.Promise(...)  // 错误,不能链式调用 'cy'

示例

使用 Cypress.Promise 创建 promises。Cypress 能识别 promise,如果你从 .then() 等命令中返回一个 promise,Cypress 会等待这些 promises 解析后再继续执行。

基础 Promise

cy.get('button').then(($button) => {
return new Cypress.Promise((resolve, reject) => {
// 在这里执行自定义操作
})
})

等待 Promises

it('等待 promises 解析', () => {
let waited = false

function waitOneSecond() {
// 返回一个在 1 秒后解析的 promise
return new Cypress.Promise((resolve, reject) => {
setTimeout(() => {
// 将 waited 设为 true
waited = true

// 用 'foo' 字符串解析
resolve('foo')
}, 1000)
})
}

cy.wrap(null).then(() => {
// 向 cy.then() 返回一个 promise,
// 会等待其解析
return waitOneSecond().then((str) => {
expect(str).to.eq('foo')
expect(waited).to.be.true
})
})
})

注意事项

被拒绝的测试 promises 不会导致测试失败

如果测试代码中有未处理的被拒绝的 promise,它不会自动导致测试失败。如果你确实希望在测试代码中存在未处理的被拒绝的 promise 时让测试失败,你需要执行以下两种操作之一:

如果在测试代码中使用 Cypress.Promise,可以使用 Bluebird 的 API 注册回调:

Cypress.Promise.onPossiblyUnhandledRejection((error, promise) => {
throw error
})

如果在测试代码中使用原生内置的 promises,可以在测试的 window 对象上注册事件监听器:

window.addEventListener('unhandledrejection', (event) => {
throw event.reason
})

注意: 因为这是测试的 window 对象,所以这样的监听器不会在每次测试前重置。你可以在 spec 文件中使用 before 钩子一次性注册这些监听器。

另请参阅