Подтвердить что ты не робот

Когда мы должны использовать. То с обещанием Транспорта?

У меня много нестабильности с Транспортером, и я уверен, что есть кое-что, что я не понимаю. Иногда мне нужно использовать .then(), когда вы нажимаете на кнопку, прежде чем продолжить, иногда это не имеет никакого влияния, и я не должен использовать .then() или тест не удалось.

Интересно, когда следует использовать обратный вызов .then() при тестировании в Protractor? Пример:

createAccountForm = $('#form-create-account');
submitButton = createAccountForm.$('button[type=submit]');

browser.wait(EC.elementToBeClickable(submitButton), 5000);
submitButton.click(); // .then(function(){   <-- uncomment in the .then form

// find the confirmation message
var message = $('.alert-success');
browser.wait(EC.visibilityOf(message), 5000);
log.debug('After visibilityOf');

expect(message.isPresent()).to.be.eventually.true;
// }); --> uncomment when in .then form

Когда я использую эту форму теста (без .then()), я вижу в браузере, что кнопка на кнопке не выполнена, тест продолжается со следующим ожиданием, а затем останавливается.

Если я использую форму .then(), щелчок по кнопке выполняется, и тест продолжается без ошибок.

В другом тесте мне не нужно использовать обратный вызов then() при нажатии кнопки.

Итак, когда следует использовать .then(), а когда нет?

Жан-Марк

4b9b3361

Ответ 1

Ответ на этот вопрос можно найти в этом сообщении: http://spin.atomicobject.com/2014/12/17/asynchronous-testing-protractor-angular/

То есть:

  • Транспортировка завершает все команды драйвера в ControlFlow,
  • когда вам нужен результат команды драйвера, вы должны использовать. then,
  • когда вам не нужен результат драйвера, которого вы можете избежать. следующие инструкции должны быть в очереди в ControlFlow, иначе они будет выполняться до команд в очереди, что приведет к непредсказуемым результат. Итак, если вы хотите запустить команду тестирования без драйверов, вы должны добавить ее в .then callback или перенести тест в Promise и поставить в очередь тест в ControlFlow. См. Пример ниже.

Вот пример моего теста, который работает без. then:

log.debug('test0');

// enqueue the click
submitButton.click(); 
var message = $('.alert-success'); 

// enqueue the wait for message to be visible  
browser.wait(EC.visibilityOf(message), 5000);  

log.debug('test1');

// enqueue a test
expect(message.isPresent()).to.be.eventually.true;
log.debug('test2');

// a function returning a promise that does an async test (check in MongoDB Collection)
var testAccount = function () {           
    var deferred = protractor.promise.defer();

    // Verify that an account has been created
    accountColl.find({}).toArray(function (err, accs) {
        log.debug('test5');
        expect(err).to.not.exist;
        log.debug('test6');
        expect(accs.length).to.equal(1);
        return deferred.fulfill();
    });
    return deferred.promise;
};

log.debug('test3');

// Enqueue the testAccount function
browser.controlFlow().execute(testAccount);  
log.debug('test4');

Результат теперь то, что мы ожидаем:

test0

test1

test2

test3

test4

test5

test6