fixture
Load a fixed set of data located in a file.
Syntax
cy.fixture(filePath)
cy.fixture(filePath, encoding)
cy.fixture(filePath, options)
cy.fixture(filePath, encoding, options)
Usage
Correct Usage
cy.fixture('users').as('usersJson') // load data from users.json
cy.fixture('logo.png').then((logo) => {
// load data from logo.png
})
Arguments
filePath (String)
A path to a file within the
fixturesFolder
, which
defaults to cypress/fixtures
.
You can nest fixtures within folders and reference them by defining the path from the fixturesFolder:
cy.fixture('users/admin.json') // Get data from {fixturesFolder}/users/admin.json
encoding (String)
The encoding to be used when reading the file. The following encodings are supported:
'ascii'
'base64'
'binary'
'hex'
'latin1'
'utf8'
'utf-8'
'ucs2'
'ucs-2'
'utf16le'
'utf-16le'
null
Using null
explicitly will return the fixture as a
Cypress.Buffer
instance, regardless of file
extension.
options (Object)
Pass in an options object to change the default behavior of cy.fixture()
.
Option | Default | Description |
---|---|---|
timeout | responseTimeout | Time to wait for cy.fixture() to resolve before timing out |
Yields
cy.fixture()
yields the contents of the file. Formatting is determined by its file extension.cy.fixture()
is a command. The yielded subject is not updated if the contents change on disk.
Examples
JSON
users.json
fixture
Load a cy.fixture('users.json').as('usersData')
Omit the fixture file's extension
When no extension is passed to cy.fixture()
, Cypress will search for files
with the specified name within the
fixturesFolder
(which
defaults to cypress/fixtures
) and resolve the first one.
cy.fixture('admin').as('adminJSON')
The example above would resolve in the following order:
cypress/fixtures/admin.json
cypress/fixtures/admin.js
cypress/fixtures/admin.coffee
cypress/fixtures/admin.html
cypress/fixtures/admin.txt
cypress/fixtures/admin.csv
cypress/fixtures/admin.png
cypress/fixtures/admin.jpg
cypress/fixtures/admin.jpeg
cypress/fixtures/admin.gif
cypress/fixtures/admin.tif
cypress/fixtures/admin.tiff
cypress/fixtures/admin.zip
Use import statement
If you are loading a JSON fixture, you can simply use the import
statement and
let the bundler load it:
// cypress/e2e/spec.cy.js
import user from '../fixtures/user.json'
it('loads the same object', () => {
cy.fixture('user').then((userFixture) => {
expect(user, 'the same data').to.deep.equal(userFixture)
})
})
Images
base64
by default
Image fixtures are sent as cy.fixture('images/logo.png').then((logo) => {
// logo will be encoded as base64
// and should look something like this:
// aIJKnwxydrB10NVWqhlmmC+ZiWs7otHotSAAAOw==...
})
Change encoding of Image fixture
cy.fixture('images/logo.png', null).then((logo) => {
// logo will be read as a buffer
// and should look something like this:
// Buffer([0, 0, ...])
expect(Cypress.Buffer.isBuffer(logo)).to.be.true
})
Playing MP3 file
cy.fixture('audio/sound.mp3', 'base64').then((mp3) => {
const uri = 'data:audio/mp3;base64,' + mp3
const audio = new Audio(uri)
audio.play()
})
Accessing Fixture Data
.then()
to access fixture data
Using cy.fixture('users').then((json) => {
cy.intercept('GET', '/users/**', json)
})
Using fixtures to bootstrap data
Modifying fixture data before using it
You can modify fixture data directly before visiting a URL or mounting a component that makes a network request to that URL.
cy.fixture('user').then((user) => {
user.firstName = 'Jane'
cy.intercept('GET', '/users/1', user).as('getUser')
})
cy.visit('/users')
cy.wait('@getUser').then(({ request }) => {
expect(request.body.firstName).to.eq('Jane')
})
cy.fixture('user').then((user) => {
user.firstName = 'Jane'
cy.intercept('GET', '/users/1', user).as('getUser')
})
cy.mount(<Users />)
cy.wait('@getUser').then(({ request }) => {
expect(request.body.firstName).to.eq('Jane')
})
Notes
Shortcuts
fixture
StaticResponse
property
Using the Fixtures can also be referenced directly without using the .fixture()
command
by using the special property fixture
on the
cy.intercept()
StaticResponse
object.
cy.intercept('GET', '/users/**', { fixture: 'users' })
Validation
Automated File Validation
Cypress automatically validates your fixtures. If your .json
, .js
, or
.coffee
files contain syntax errors, they will be shown in the Command Log.
Encoding
Default Encoding
Cypress automatically determines the encoding for the following file types:
.json
.js
.coffee
.html
.txt
.csv
.png
.jpg
.jpeg
.gif
.tif
.tiff
.zip
For other types of files, they will be read as utf8
by default, unless
specified in the second argument of cy.fixture()
. You can specify null
as
the encoding in order to read the file as a
Cypress.Buffer
instance instead.
this
context
If you store and access the fixture data using this
test context object, make
sure to use function () { ... }
callbacks. Otherwise the test engine will NOT
have this
pointing at the test context.
describe('User page', () => {
beforeEach(function () {
// "this" points at the test context object
cy.fixture('user').then((user) => {
// "this" is still the test context object
this.user = user
})
})
// the test callback is in "function () { ... }" form
it('has user', function () {
// this.user exists
expect(this.user.firstName).to.equal('Jane')
})
})
Loaded just once
Please keep in mind that fixture files are assumed to be unchanged during the test, and thus Cypress loads them just once. Even if you overwrite the fixture file itself, the already loaded fixture data remains the same.
If you wish to dynamically change the contents of a file during your tests,
consider cy.readFile()
instead.
For example, if you want to reply to a network request with different object, the following will not work:
// 🚨 DOES NOT WORK
cy.intercept('GET', '/todos/1', { fixture: 'todo' }).as('todo')
// application requests the /todos/1 resource
// the intercept replies with the object from todo.json file
cy.wait('@todo').then(() => {
cy.writeFile('/cypress/fixtures/todo.json', { title: 'New data' })
})
// application requests the /todos/1 resource again
// the intercept replies with the originally loaded object
// from the todo.json file and NOT { "title": "New data" }
In this situation, avoid using the fixture file and instead respond to the network request with the object
// ✅ RESPOND WITH OBJECT
cy.fixture('todo.json').then((todo) => {
cy.intercept('GET', '/todos/1', { body: todo }).as('todo')
// application requests the /todos/1 resource
// the intercept replies with the initial object
cy.wait('@todo').then(() => {
// modify the response object
todo.title = 'New data'
// and override the intercept
cy.intercept('GET', '/todos/1', { body: todo })
})
})
Rules
Requirements
-
cy.fixture()
requires being chained off ofcy
.
Assertions
-
cy.fixture()
will only run assertions you have chained once, and will not retry .
Timeouts
cy.fixture()
should never time out.
Because cy.fixture()
is asynchronous it is technically possible for there to
be a timeout while talking to the internal Cypress automation APIs. But for
practical purposes it should never happen.
Command Log
cy.fixture()
does not log in the Command Log
See also
- Guide: Variables and Aliases
cy.intercept()
.then()
.readFile()
for a similar command without caching and with builtin retryability- Recipe: Bootstrapping App Test Data
- Fixtures section of the Cypress Testing Workshop
- Blog: Load Fixtures from Cypress Custom Commands explains how to load or import fixtures to be used in the Cypress custom commands.