2013-05-06 2 views
18

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

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

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 заявления выход:

BAC

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

ABC

ответ

17

waitsFor не делает блок до условий его ждет ибо встречаются или время истекает.

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

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

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

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

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

+0

Я совершенно уверен, что это не так. Вы устанавливаете оператор между 'waitsFor' и вторым' run', он будет выполнен перед кодом в 'waitsFor', я обновлю свой вопрос, чтобы это отразить. –

+0

Но спасибо за ссылку на документацию, я этого не знал :) –

+0

И еще раз спасибо, ответ в документах, но не совсем там, где вы указали :) –

4

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

несколько пробегов() блоки в спецификации будут работать серийно. (Jasmine Documentation)

2

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

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

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

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

+1

Jasmine 1.3 обеспечивает ожидания для методов (не ждатьFor) ответ должен быть исправлен. – florianb

Смежные вопросы