Skip to main content
Cypress应用

stub

替换函数、记录其使用情况并控制其行为。

cy.stub() 是一个实用函数,不是 Cypress 命令、查询或断言。它不可重试、不可链式调用、也不支持超时。

info

注意: .stub() 假设您已熟悉我们的指南: 存根、间谍和时钟

语法

cy.stub()
cy.stub(object, method)

用法

正确用法

cy.stub(user, 'addFriend')
cy.stub(user, 'addFriend').as('addFriend')

参数

object (Object)

包含要被替换 methodobject

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

禁用命令日志记录

您可以链式调用 .log(bool) 方法来禁止 cy.stub() 调用显示在命令日志中。这在存根被调用次数过多时可能有用。

const obj = {
foo() {},
}
const stub = cy.stub(obj, 'foo').log(false)

更多 cy.stub() 示例

别名

您可以给存根起别名,类似于 .as() 的工作方式。这可以使您的存根在错误消息和 Cypress 的命令日志中更容易识别,并允许您稍后使用 cy.get() 对它们进行断言。

const obj = {
foo() {},
}
const stub = cy.stub(obj, 'foo').as('anyArgs')
const withFoo = stub.withArgs('foo').as('withFoo')

obj.foo()

expect(stub).to.be.called
cy.get('@withFoo').should('be.called') // 故意失败的断言

您将在命令日志中看到以下内容:

带别名的存根

注意事项

恢复

测试之间的自动重置/恢复

cy.stub()沙盒 中创建存根,因此所有创建的存根都会在测试之间自动重置/恢复,无需您显式重置/恢复它们。

差异

cy.spy() 和 cy.stub() 的区别

cy.spy()cy.stub() 的主要区别在于 cy.spy() 不会替换方法,它只是包装方法。因此,虽然调用被记录,但原始方法仍会被调用。这在测试原生浏览器对象上的方法时非常有用。您可以验证方法是否被测试调用,同时仍然调用原始方法操作。

命令日志

创建存根、起别名并调用它

const obj = {
foo() {},
}
const stub = cy.stub(obj, 'foo').as('foo')

obj.foo('foo', 'bar')
expect(stub).to.be.called

上面的命令将在命令日志中显示为:

命令日志中的存根

当点击命令日志中的 (stub-1) 事件时,控制台会输出以下内容:

控制台日志中的存根

历史

版本变更
0.20.0添加了 .log(bool) 方法
0.18.8添加了 cy.stub() 命令

另请参阅