Как добавить обещание в очередь управления потоком с помощью транспортира?
В моем тесте я звоню и за пределами библиотеки, чтобы засеять данные в нашем бэкэнд, прежде чем запускать некоторые тесты 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(); })
Хотя это не добавляет обещания к управлению потоком, вы все равно получаете тот же результат.