Spec-Zone.ru › Cypress

wrap

Возвращает объект, переданный в .wrap(). Если объект является промисом, возвращает его разрешенное значение.

Синтаксис

cy.wrap(subject)
cy.wrap(subject, options)

Использование

Правильное использование

cy.wrap({ name: 'Jane Lane' })

Аргументы

subject (Объект)

Объект, который нужно вернуть.

options (Объект)

Передайте объект options, чтобы изменить стандартное поведение cy.wrap().

Опция Значение по умолчанию Описание
log true Отображает команду в Журнале команд
timeout defaultCommandTimeout Время ожидания cy.wrap() для разрешения перед выходом по таймауту

Возвращаемое значение

  • cy.wrap() 'возвращает объект, с которым был вызван'

Примеры

Объекты

Вызов функции на объекте в wrap и возвращение нового значения

const getName = () => {
  return 'Jane Lane'
}

cy.wrap({ name: getName }).invoke('name').should('eq', 'Jane Lane') // true

Элементы

Оборачивание элементов для продолжения выполнения команд

cy.get('form').within(($form) => {
  // ... more commands

  cy.wrap($form).should('have.class', 'form-container')
})

Условное оборачивание элементов

cy.get('button').then(($button) => {
  // $button is a wrapped jQuery element
  if ($button.someMethod() === 'something') {
    // wrap this element so we can
    // use cypress commands on it
    cy.wrap($button).click()
  } else {
    // do something else
  }
})

Промисы

Вы можете обернуть промисы, возвращаемые кодом приложения. Команды Cypress автоматически будут ожидать разрешения промиса перед продолжением с возвращаемым значением к следующей команде или утверждению. Обратитесь к рецепту Вход с использованием кода приложения для полного примера.

Простой пример

const myPromise = new Promise((resolve, reject) => {
  // we use setTimeout(...) to simulate async code.
  setTimeout(() => {
    resolve({
      type: 'success',
      message: 'It worked!',
    })
  }, 2500)
})

it('should wait for promises to resolve', () => {
  cy.wrap(myPromise).its('message').should('eq', 'It worked!')
})
Wrap of promises

Пример приложения

// import application code for logging in
import { userService } from '../../src/_services/user.service'

it('can assert against resolved object using .should', () => {
  cy.log('user service login')
  const username = Cypress.env('username')
  const password = Cypress.env('password')

  // wrap the promise returned by the application code
  cy.wrap(userService.login(username, password))
    // check the yielded object
    .should('be.an', 'object')
    .and('have.keys', ['firstName', 'lastName', 'username', 'id', 'token'])
    .and('contain', {
      username: 'test',
      firstName: 'Test',
      lastName: 'User',
    })

  // cy.visit command will wait for the promise returned from
  // the "userService.login" to resolve. Then local storage item is set
  // and the visit will immediately be authenticated and logged in
  cy.visit('/')
  // we should be logged in
  cy.contains('Hi Test!').should('be.visible')
})

Примечание: .wrap() не будет синхронизировать асинхронные вызовы функций за вас. Например, в приведенном ниже примере:

  • У вас есть две асинхронные функции async function foo() {...} и async function bar() {...}
  • Вы должны убедиться, что foo() разрешен(а) до вызова bar()
  • bar() также зависит от некоторых данных, которые создаются после вызова других команд Cypress.

Если вы обернете асинхронные функции в cy.wrap(), то bar() может быть вызван преждевременно, прежде чем необходимые данные станут доступны:

cy.wrap(foo())

cy.get('some-button').click()
cy.get('some-input').type(someValue)
cy.get('some-submit-button').click()

// this will execute `bar()` immediately without waiting
// for other cy.get(...) functions to complete
cy.wrap(bar()) // DON'T DO THIS

Это поведение связано с вызовом функций foo() и bar(), которые вызывают функции немедленно для возврата Promise.

Если вы хотите, чтобы bar() выполнялся после foo() и команд cy.get(), одним из решений является цепочку команд с использованием .then():

cy.wrap(foo())

cy.get('some-button').click()
cy.get('some-input').type(someValue)
cy.get('some-submit-button')
  .click()
  .then(() => {
    // this will execute `bar()` after the
    // other cy.get(...) functions complete
    cy.wrap(bar())
  })

Правила

Требования

  • cy.wrap() требует цепочки от cy .

Утверждения

  • cy.wrap() , когда его аргументом является промис, автоматически будет ждать разрешения промиса. Если промис отклонен, cy.wrap() приведет к провалу теста.
  • cy.wrap() автоматически повторит попытки, пока все утверждения в цепочке не пройдут.

Таймауты

  • cy.wrap() может выйти по таймауту, ожидая, пока утверждения, которые вы добавили, не пройдут.

Журнал команд

Выполнение утверждений об объекте

cy.wrap({ amount: 10 }).should('have.property', 'amount').and('eq', 10)

Вышеуказанные команды отобразятся в Журнале команд как:

Command Log wrap

При нажатии на команду wrap в журнале команд, консоль выведет следующее:

Console Log wrap

История

Версия Изменения
3.2.0 Повторение cy.wrap() если undefined при последующем вызове .should()
0.4.5 Добавлена команда cy.wrap()

См. также

  • .invoke()
  • .its()
  • .should()
  • .spread()
  • .then()
  • Вход: Использование кода приложения
  • Тестирование на единицу: Код приложения

© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/wrap

Spec-Zone.ru

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