Spec-Zone.ru › Cypress

фиксатура

Загрузка фиксированного набора данных, расположенного в файле.

Синтаксис

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

Пример выше будет разрешён в следующем порядке:

  1. cypress/fixtures/admin.json
  2. cypress/fixtures/admin.js
  3. cypress/fixtures/admin.coffee
  4. cypress/fixtures/admin.html
  5. cypress/fixtures/admin.txt
  6. cypress/fixtures/admin.csv
  7. cypress/fixtures/admin.png
  8. cypress/fixtures/admin.jpg
  9. cypress/fixtures/admin.jpeg
  10. cypress/fixtures/admin.gif
  11. cypress/fixtures/admin.tif
  12. cypress/fixtures/admin.tiff
  13. cypress/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() для инициализации данных для нашего приложения.

Модификация данных фиксатуры перед их использованием

Вы можете изменить данные фиксатуры непосредственно перед передачей их в маршрут.

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API