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

Что жасмин работает и ждет? На самом деле?

Я использую запуск жасмина и жду, чтобы проверить асинхронные операции. Все работает отлично, но я не совсем уверен, что происходит за кулисами.

В документации по жасмину указан следующий пример, в который я добавил три оператора журнала.

describe("Asynchronous specs", function() {
  var value, flag;

  it("should support async execution of test preparation and exepectations", function() {

    runs(function() {
      flag = false;
      value = 0;

      setTimeout(function() {
        flag = true;
      }, 500);
    });

    waitsFor(function() {
      value++;
      if(flag) {
          console.log("A");
      }
      return flag;
    }, "The Value should be incremented", 750);

    console.log("B");

    runs(function() {
      console.log("C");
      expect(value).toBeGreaterThan(0);
    });
  });
});

});

Первые runs и waitsFor для меня совершенно ясны. runs запускает асинхронную операцию, а waitsFor ждет условие.

Однако я не понимаю, почему второй runs не запускается до завершения waitsFor. waitsFor не является блокирующим вызовом.

Я предполагаю, что waitsFor неявно блокирует любой следующий вызов runs до его завершения. Это так?

Мое свидетельство заключается в том, что вывод команд console.log:

B A C

Но если waitsFor действительно блокирует, он должен быть

A B C

4b9b3361

Ответ 1

waitsFor блокируется до тех пор, пока не будут выполнены ожидаемые условия или время ожидания.

Из jasmine docs: "waitsFor() обеспечивает лучший интерфейс для приостановки вашей спецификации до завершения какой-либо другой работы. Жасмин будет ждать до тех пор, пока предоставленная функция возвращает true, прежде чем продолжить следующий блок.".

Связанные документы также имеют несколько более четкий пример или waitsFor.

EDIT: А теперь я понимаю, что вы имеете в виду. waitsFor не будет блокировать JS, который не завернут в runs, waitsFor, ect.

Что жасмин делает, это передать функцию, переданную ей через runs или waitsFor, и если жасмин в настоящее время не ждет, он немедленно выполняет эту функцию. Если он ждет, он не вызывает его, пока он не закончит ожидание.

Это не останавливает console.log, поскольку оно передается жасмину, поэтому жасмин не может помешать ему немедленно выполнить его.

Ответ 2

Решение находится в документации:

Несколько циклов run() в спецификации будут запускаться последовательно. (Документация Жасмина)

Ответ 3

С сайта: http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=mzNDUVfhFXg

Жасмин будет вызывать методы run() и waitsFor() в том порядке, в котором вы передал их. Как только парсер JS дойдет до метода waitsFor(), он будет опросить его до тех пор, пока он не вернет true, и только тогда он продолжит следующий метод run().

По сути, функции run() и waitsFor() заполняют массив своими предоставленными функциями. Затем массив обрабатывается jamine, в котором функции вызывается последовательно. Ожидается, что те функции, которые были зарегистрированы run(), будут выполнять фактическую работу, в то время как те, которые зарегистрированы waititsFor(), будут функционировать "защелки" и будут опрошены (вызваны) каждые 10 мс до тех пор, пока они не вернутся к истине или не истечет время регистрации в факультативном периоде. Если период ожидания истекает, сообщается об ошибке с использованием необязательного зарегистрированного сообщения об ошибке; в противном случае процесс продолжается со следующей функцией в массиве. Предположительно, ожидания в рамках run() также могут инициировать отчет об отказе (и, возможно, даже в самих функциях защелки).

Документация особенно тупо по этим асинхронным функциям.