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
钩子一次性注册这些监听器。