Wrap a method in a spy in order to record calls to and arguments of the function.
Note:
.spy()assumes you are already familiar with our guide: Stubs, Spies, and Clocks
cy.spy(object, method)
Correct Usage
cy.spy(user, 'addFriend')
object (Object)
The object that has the method to be wrapped.
method (String)
The name of the method on the object to be wrapped.
Unlike most Cypress commands, cy.spy() is synchronous and returns a value (the spy) instead of a Promise-like chain-able object.
cy.spy() returns a Sinon.js spy. All methods found on Sinon.JS spies are supported.
// assume App.start calls util.addListeners
cy.spy(util, 'addListeners')
App.start()
expect(util.addListeners).to.be.called
You can chain a .log(bool) method to disable cy.stub() calls from being shown in the Command Log. This may be useful when your stubs are called an excessive number of times.
const obj = {
foo() {},
}
const stub = cy.stub(obj, 'foo').log(false)
cy.spy() examplesCheck out our example recipe testing spying, stubbing and time
Adding an alias using .as() to spies makes them easier to identify in error messages and Cypress' command log.
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
expect(withFoo).to.be.called // purposefully failing assertion
You will see the following in the command log:
cy.spy() creates spies in a sandbox, so all spies created are automatically reset/restored between tests without you having to explicitly reset/restore them.
The main difference between cy.spy() and cy.stub() is that cy.spy() does not replace the method, it only wraps it. So, while invocations are recorded, the original method is still called. This can be very useful when testing methods on native browser objects. You can verify a method is being called by your test and still have the original method action invoked.
Cypress has also built-in sinon-chai support, so any assertions supported by sinon-chai can be used without any configuration.
cy.spy() requires being chained off of cy . cy.spy() cannot have any assertions chained. cy.spy() cannot time out. Create a spy, alias it, and call it
const obj = {
foo() {},
}
const spy = cy.spy(obj, 'foo').as('foo')
obj.foo('foo', 'bar')
expect(spy).to.be.called
The command above will display in the Command Log as:
When clicking on the spy-1 event within the command log, the console outputs the following:
| Version | Changes |
|---|---|
| 0.20.0 | Added .log(bool) method |
| 0.18.8 |
cy.spy() command added |
© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/spy