фиксатура
Загрузка фиксированного набора данных, расположенного в файле.
Синтаксис
cy.fixture(filePath)
cy.fixture(filePath, encoding)
cy.fixture(filePath, options)
cy.fixture(filePath, encoding, options)
Использование
Правильное использование
cy.fixture('users').as('usersJson') // load data from users.json
cy.fixture('logo.png').then((logo) => {
// load data from logo.png
})
Аргументы
filePath (Строка)
Путь к файлу в fixturesFolder, по умолчанию cypress/fixtures.
Вы можете вкладывать фиксатуры в папки и ссылаться на них, определив путь от fixturesFolder:
cy.fixture('users/admin.json') // Get data from {fixturesFolder}/users/admin.json
encoding (Строка)
Кодировка, используемая при чтении файла. Поддерживаются следующие кодировки:
'ascii''base64''binary''hex''latin1''utf8''utf-8''ucs2''ucs-2''utf16le''utf-16le'null
Использование null явно вернёт фиксатуру как экземпляр Cypress.Buffer, независимо от расширения файла.
options (Объект)
Передайте объект options, чтобы изменить поведение по умолчанию cy.fixture().
| Опция | По умолчанию | Описание |
|---|---|---|
timeout |
responseTimeout |
Время ожидания cy.fixture() для разрешения перед выходом за пределы времени ожидания
|
Возвращаемые значения
cy.fixture() возвращает содержимое файла. Форматирование определяется расширением файла.
Примеры
JSON
Загрузка фиксатуры users.json
cy.fixture('users.json').as('usersData')
Пропуск расширения файла фиксатуры
Если расширение не передано в cy.fixture(), Cypress будет искать файлы с указанным именем в fixturesFolder (по умолчанию cypress/fixtures) и разрешит первый найденный.
cy.fixture('admin').as('adminJSON')
Пример выше будет разрешён в следующем порядке:
cypress/fixtures/admin.jsoncypress/fixtures/admin.jscypress/fixtures/admin.coffeecypress/fixtures/admin.htmlcypress/fixtures/admin.txtcypress/fixtures/admin.csvcypress/fixtures/admin.pngcypress/fixtures/admin.jpgcypress/fixtures/admin.jpegcypress/fixtures/admin.gifcypress/fixtures/admin.tifcypress/fixtures/admin.tiffcypress/fixtures/admin.zip
Использование инструкции import
Если вы загружаете JSON-фиксатуру, вы можете просто использовать инструкцию import и позволить загрузчику загрузить её:
// cypress/integration/spec.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)
})
})
Изображения
Изображения-фиксатуры по умолчанию отправляются как base64
cy.fixture('images/logo.png').then((logo) => {
// logo will be encoded as base64
// and should look something like this:
// aIJKnwxydrB10NVWqhlmmC+ZiWs7otHotSAAAOw==...
})
Изменение кодировки фиксатуры изображения
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
})
Воспроизведение файла MP3
cy.fixture('audio/sound.mp3', 'base64').then((mp3) => {
const uri = 'data:audio/mp3;base64,' + mp3
const audio = new Audio(uri)
audio.play()
})
Доступ к данным фиксатуры
Использование .then() для доступа к данным фиксатуры
cy.fixture('users').then((json) => {
cy.intercept('GET', '/users/**', json)
})
Использование фиксатур для инициализации данных
Модификация данных фиксатуры перед их использованием
Вы можете изменить данные фиксатуры непосредственно перед передачей их в маршрут.
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')
})
Примечания
Сокращения
Использование свойства fixture StaticResponse
На фиксатуры также можно ссылаться напрямую, не используя команду .fixture(), с помощью специального свойства fixture объекта cy.intercept() StaticResponse.
cy.intercept('GET', '/users/**', { fixture: 'users' })
Валидация
Автоматическая валидация файлов
Cypress автоматически проверяет ваши фиксатуры. Если ваши файлы .json, .js, или .coffee содержат синтаксические ошибки, они будут отображены в журнале команд.
Кодировка
Кодировка по умолчанию
Cypress автоматически определяет кодировку для следующих типов файлов:
.json.js.coffee.html.txt.csv.png.jpg.jpeg.gif.tif.tiff.zip
Для других типов файлов они будут читаться как utf8 по умолчанию, если не указано в втором аргументе cy.fixture(). Вы можете указать null в качестве кодировки, чтобы прочитать файл как экземпляр Cypress.Buffer.
this контекст
Если вы храните и получаете данные фиксатуры, используя объект контекста теста this, убедитесь, что используете обратные вызовы function () { ... }. В противном случае движок тестов НЕ будет иметь this, указывающий на контекст теста.
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')
})
})
Загружается только один раз
Пожалуйста, имейте в виду, что предполагается, что файлы фиксатур не изменятся во время теста, и поэтому тест-запускатель загружает их только один раз. Даже если вы перезапишете сам файл фиксатуры, уже загруженные данные фиксатуры останутся прежними.
Если вы хотите динамически изменять содержимое файла во время тестов, рассмотрите cy.readFile() вместо этого.
Например, если вы хотите ответить на сетевой запрос другим объектом, следующее не будет работать:
// 🚨 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" }
В этой ситуации избегайте использования файла фиксатуры и вместо этого отвечайте на сетевой запрос объектом
// ✅ 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 })
})
})
Правила
Требования
-
cy.fixture()требует цепочки отcy.
Ассершены
-
cy.fixture()будет запускать ассершены, которые вы прицепили только один раз, и не будет повторяться .
Таймауты
-
cy.fixture()не должен вызывать таймаут.
Поскольку
cy.fixture()является асинхронным, теоретически возможен таймаут при взаимодействии с внутренними API Cypress. Но для практических целей этого не должно произойти.
Журнал команд
-
cy.fixture()не записывается в журнал команд
См. также
- Руководство: Переменные и псевдонимы
cy.intercept().then()-
.readFile()для аналогичной команды без кэширования и с встроенной повторной обработкой - Рецепт: Инициализация тестовых данных приложения
- Фиксатуры в разделе Cypress Testing Workshop
- Блог: Загрузка фиксатур из пользовательских команд Cypress объясняет, как загрузить или импортировать фиксатуры для использования в пользовательских командах Cypress.
© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/fixture