Передача данных от одного шага к следующему синхронно - PullRequest
0 голосов
/ 19 ноября 2018

Запуск Cypress 3.1.1 с кипарисом-огурцом-препроцессором 1.5.1.Мне нужно передать некоторые статические данные от одного шага к другому (в том же сценарии / тесте).Я могу сделать это, используя псевдоним, например: cy.wrap(someString).as('myString'), но затем я должен получить к нему асинхронный доступ:

cy.get('@myString').then(myString => ...)

Это довольно громоздко, особенно когда мне нужно пройтинесколько значений, требующих нескольких завернутых замыканий, без видимой выгоды.(В настоящее время я работаю над этим путем наложения псевдонимов на объект, но мне не нужно этого делать.)

Как я могу передавать примитивные значения из одного шага в другой синхронно?

Iдумал, что я мог бы просто установить this.myString='' для установки значения в объекте общего контекста Mocha, но в этом случае свойство существует, но при доступе к нему на последующих шагах устанавливается значение undefined.

Даже при создании моегособственная переменная контекста с let вне определения шага не работает.Это просто ограничение Cypress и / или Cypress-Cucumber-препроцессор?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вот немного более сложный (и не полностью протестированный) метод. Пользовательская команда может быть добавлена ​​для сохранения значений в глобальном объекте.

В Cypress Runner все тесты кажутся для последовательного выполнения, но вам, возможно, следует быть осторожным при использовании CI и параллельного выполнения.

В / support / commands.js

export const testStore = {}

Cypress.Commands.add('saveAs', { prevSubject: true }, (value, propName) => {
  console.log('saveAs', value, propName)
  testStore[propName] = value;
  return value; 
})

В myTest.spec.js

import { testStore } from '../support/commands.js'
...

it('should have a title', () => {
  cy.title()
    .saveAs('title')             // save for next test
    .should('contain', 'myTitle) // this test's expectation
});

it('should test something else', () => {
  cy.get('.myElement').contains(testStore.title);
});
0 голосов
/ 20 ноября 2018

Это не полный ответ, но вы можете установить переменные javascript в операторе before(() => {}), и они будут доступны для использования в любых вложенных it(..., () => {}) инструкциях.

ДляНапример, у меня есть один набор тестов, проверяющих две версии одного и того же приложения, написанные в разных средах.Поэтому мне нужно знать тестируемый фреймворк и загрузить разные приборы.

Для этого я использую следующее

const framework = Cypress.env('FRAMEWORK')
let config;

before(function() {
  cy.fixture('frameworks').then(fixture => {
    config = fixture[framework]
  })
})

Затем я могу использовать config в тестах,

cy.visit(config.pageUrl)

it('should have a title', () => {
  cy.title().should('contain', config.title)
});

Вы можете использовать before() во многих местах набора тестов, как правило, после describe() или context(), а переменные, определенные внутри, доступны «обычным» способом JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...