Как добавить обещание в очередь управления потоком с помощью транспортира?

В моем тесте я звоню и за пределами библиотеки, чтобы засеять данные в нашем бэкэнд, прежде чем запускать некоторые тесты ui с помощью транспортира.

'use strict'

var dataBuilder = require('data_builder.js');

describe('test', function () {
  var testData = {
    name: 'foo',
    title: 'bar',
    ...
  };

  beforeEach(function () {
    //create test data on the backend
    dataBuilder.create(testData).then(function (id) {
      testData.id = id.id;
    });
  });



  it('test something', function () {
    ...
  });

Таким образом, обещание, возвращаемое dataBuilder, не разрешается до того, как оно() фактически закончится. Как добавить обещание, возвращаемое dataBuilder, в управление потоком webDriver?

Ответы

Ответ 1

Транспортир предоставляет объект WebDriverJS promises для объекта транспортира, поэтому вы можете использовать метод flow.await или создать новое обещание и использовать flow.execute.

Первое может быть достигнуто примерно так:

flow = protractor.promise.controlFlow()

flow.await(dataBuilder.create(testData)).then( function(id) {
    testData.id = id.id;
})

И вы можете увидеть пример последнего в этом сообщении .

Это может быть сделано в самой функции it или если это является общим для всех ваших тестов, подумайте о том, чтобы поместить его в функцию onPrepare вашего конфигуратора транспортира.

Ответ 2

В моих тестах транспортира я добавляю что-то в управление потоком webDriver, используя следующий шаблон. Если кто-то создает и возвращает обещание от этих "различных заявлений", обещание будет правильно вставлено в поток управления.

browser.controlFlow().execute(function() {
    // various statements
});

Ответ 3

В этом конкретном случае вы можете использовать обратный вызов done в beforeEach следующим образом:

beforeEach(function (done) {
   dataBuilder
      .create(testData)
      .then(function (id) {
         testData.id = id.id;
      })
      .finally(done);
});

Принятие параметра done callback указывает, что настройка асинхронна.

Ответ 4

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

browser.sleep(1).then(()=> {
  return someAsyncPromiseAction();
})

Другая вещь, которую вы могли бы сделать, - это просто полагаться на действие перед ним. Так что если вы, например, просто нажали кнопку, это будет выглядеть как

$(' ... ').click().then( () => { return someAsync(); })

Хотя это не добавляет обещания к управлению потоком, вы все равно получаете тот же результат.