Skip to main content
Cypress应用

spy

包装一个方法为间谍函数,以记录该函数的调用和参数。

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

info

注意: 使用 .spy() 前请确保已阅读我们的指南: 存根、间谍和时钟

语法

cy.spy(object, method)

用法

正确用法

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

参数

object (Object)

包含待包装方法的对象

method (String)

待包装的方法名

生成结果 了解主题管理

  • cy.spy() 是_同步_的,返回一个值(间谍函数)而非Promise-like链式对象。可被别名化。
  • cy.spy() 返回一个 Sinon.js 间谍函数,支持所有Sinon.JS间谍函数的方法。

示例

方法

用间谍函数包装方法

// 假设App.start调用了util.addListeners
cy.spy(util, 'addListeners')
App.start()
expect(util.addListeners).to.be.called

禁用命令日志记录

通过链式调用.log(bool)方法,可禁止cy.spy()调用显示在命令日志中。当存根被频繁调用时特别有用。

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

更多cy.spy()示例

别名

可以为间谍函数设置别名,类似于.as()的用法。这便于在错误信息和Cypress命令日志中识别间谍函数,并支持后续用cy.get()进行断言。

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

obj.foo()

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

命令日志中将显示如下内容:

带别名的间谍函数

注意事项

重置

测试间自动重置/恢复

cy.spy()沙盒中创建间谍函数,因此所有创建的间谍函数会在测试之间自动重置/恢复,无需显式操作。

差异

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

主要区别在于cy.spy()不会替换原方法,仅进行包装。因此虽然调用会被记录,但原方法仍会被执行。这在测试浏览器原生对象方法时特别有用——既能验证方法是否被调用,又能保留原方法行为。

断言

断言支持

Cypress内置了Sinon-Chai支持,因此无需配置即可使用所有Sinon-Chai支持的断言

命令日志

创建间谍函数、设置别名并调用

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

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

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

命令日志中的间谍函数

点击命令日志中的spy-1事件时,控制台将输出:

控制台日志中的间谍函数

历史版本

版本变更
0.20.0新增.log(bool)方法
0.18.8新增cy.spy()命令

另请参阅