stub
替换函数、记录其使用情况并控制其行为。
cy.stub()
是一个实用函数,不是 Cypress 命令、查询或断言。它不可重试、不可链式调用、也不支持超时。
info
注意: .stub()
假设您已熟悉我们的指南:
存根、间谍和时钟
语法
cy.stub()
cy.stub(object, method)
用法
正确用法
cy.stub(user, 'addFriend')
cy.stub(user, 'addFriend').as('addFriend')
参数
object (Object)
包含要被替换 method
的 object
。
method (String)
要被替换的 object
上的 method
名称。
生成结果
cy.stub()
是 同步 的,返回一个值(存根)而不是类似 Promise 的可链式对象。它可以被别名化。cy.stub()
返回一个 Sinon.js 存根。支持 Sinon.js 间谍和存根的所有方法。
示例
方法
创建存根并手动替换函数
// 假设 App.start 调用 util.addListeners
util.addListeners = cy.stub()
App.start()
expect(util.addListeners).to.be.called
用存根替换方法
// 假设 App.start 调用 util.addListeners
cy.stub(util, 'addListeners')
App.start()
expect(util.addListeners).to.be.called
用函数替换方法
// 假设 App.start 调用 util.addListeners
let listenersAdded = false
cy.stub(util, 'addListeners').callsFake(() => {
listenersAdded = true
})
App.start()
expect(listenersAdded).to.be.true
指定存根方法的返回值
// 假设 App.start 调用 util.addListeners,它返回一个
// 用于移除监听器的函数
const removeStub = cy.stub()
cy.stub(util, 'addListeners').returns(removeStub)
App.start()
App.stop()
expect(removeStub).to.be.called
替换内置窗口方法如 prompt
在端到端测试中,替换内置的 window
方法需要在页面访问 之后,但在被测应用加载 之前 进行。您可以通过在 cy.visit()
命令的 onBeforeLoad
函数中存根函数来实现。
在组件测试中,因为页面不会重新 加载,您只需要在挂载组件之前存根函数。
- 端到端测试
- 组件测试
cy.visit('http://localhost:3000', {
onBeforeLoad(win) {
// 在这里存根您的函数
cy.stub(win, 'prompt').returns('my custom message')
},
})
App.start()
cy.window().its('prompt').should('be.called')
cy.get('.name').should('have.value', 'my custom message')
// 在这里存根您的函数
cy.mount()
cy.stub(window, 'prompt').returns('my custom message')
// 然后挂载您的组件
cy.mount(<MyComponent />)
cy.window().its('prompt').should('be.called')
cy.get('.name').should('have.value', 'my custom message')
禁用命令日志记录
您可以链式调用 .log(bool)
方法来禁止 cy.stub()
调用显示在命令日志中。这在存根被调用次数过多时可能有用。
const obj = {
foo() {},
}
const stub = cy.stub(obj, 'foo').log(false)