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!')
})
Пример приложения
// 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)
Вышеуказанные команды отобразятся в Журнале команд как:
При нажатии на команду wrap в журнале команд, консоль выведет следующее:
История
| Версия | Изменения |
|---|---|
| 3.2.0 | Повторение cy.wrap() если undefined при последующем вызове .should()
|
| 0.4.5 |
Добавлена команда cy.wrap() |
См. также
© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/wrap