Предотвратить проталкивание до завершения обещания

У меня есть обработка async WebDriverJS, которая пропускается, потому что тест завершается до того, как они будут разрешены. Как заставить транспортир ждать?

Например: (оба этих теста должны потерпеть неудачу (предоставленный потенциальный билет)

  it('test promise ', function (done) {
      var d = protractor.promise.defer();
      d.fulfill(true)
      d.promise.then(function (item) {
          console.log("fulfill", item);
      });
      expect(d.promise)
          .toBe(false);
      console.log("test done");
  });

  it('test promise with timeout ', function (done) {
      var d = protractor.promise.defer();
      setTimeout(function () {
          console.log("fulfill");
          d.fulfill(true)
      }, 3000);

      d.promise.then(function (item) {
          console.log("fulfill", item);
      });
      expect(d.promise)
          .toBe(false);
      console.log("test done");
  });

Сообщите мне, если вам нужна дополнительная информация...?

Это вернет true.. если вы удалите тайм-аут и просто установите выполнение, он будет работать...

Ответ 1

Сторона транспортира

Исправление для этого было слито 11 дней назад

Вы можете работать с createFlow, но решение будет намного проще, просто вызовите done() после fulfill следующим образом:

it('test promise with setTimeout ', function(done) {
  var d = protractor.promise.defer();
  setTimeout(function() {
    console.log("fulfill");
    d.fulfill('ok');
    done();
  }, 3000);
  expect(d).toBe('ok');
});

В настоящее время на главной ветки, поэтому ожидайте, что это будет отправлено в транспортиp >= 0.23.0

Сторона веб-приложения (информативная)

Транскаватор не знает, как ждать setTimeout

Но умеет ждать $timeout

Ответ 2

Я не мог заставить пример Nix работать, поэтому я взял предложение Като и сделал следующее:

describe('Tests stuff', function () {

    function do_work() {
        var d = protractor.promise.defer();
        protractor.promise.controlFlow().execute(function () {
            setTimeout(function () {
                console.log("fulfill");
                d.fulfill(true)
            }, 3000);
        });
        return d;
    }

    it('test promise with timeout ', function () {
        protractor.promise.controlFlow().wait(do_work).then(function (done) {
            console.log("test done:" + done);
        });
    });
});

Вывод out так, как ожидалось, и метод ждет правильно, а затем следует следующий поток. Мой вывод:

Started
fulfill
test done:true

Я уверен, что есть много других способов заставить это работать, однако это сработало для меня.

Ответ 3

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

Решение:

it('test promise with timeout ', function (done) {
  var wait = protractor.promise.createFlow(function(flow){
      var d = protractor.promise.defer();
      flow.execute(function(){
          setTimeout(function () {
            console.log("fulfill");
            d.fulfill(true)
           }, 3000);
      });
  });

  expect(wait).toBe(false);
  console.log("test done");
 });