Когда следует вызывать test.done() в CasperJS?

Я использую модуль casper tester, и у меня была такая структура:

casper.start();

...(various then() and wait() calls)

casper.then(function(){
  test.done();
  });
casper.run();

Выполнение этого таким образом, казалось, работало нормально (за исключением прерывистой проблемы с таймером, которую я пытался устранить).

Если я изменю приведенное выше, следующее, что показано в документах casper, и я думал, что это в основном одно и то же:

casper.start();

...(various then() and wait() calls)

casper.run(function(){
  test.done();
  });

затем я получаю «ПРЕДУПРЕЖДЕНИЕ. Похоже, вы не проводили никаких тестов». Я понял, что это потому, что у меня еще не было assert() звонков! Я добавил необоснованное утверждение, и предупреждение исчезло, и теперь я начинаю получать отчет о количестве выполненных тестов и т. Д. (Проблема прерывистого таймера остается, так что это должно быть что-то еще.)

Но это заставило меня понять, что я должен был сделать это вторым способом, и что, очевидно, есть разница.

Может кто-нибудь объяснить, в чем разница, и почему первый не работал правильно? Я надеюсь, что это приведет к более глубокому пониманию того, как работают тесты CasperJS!


person Darren Cook    schedule 03.03.2014    source источник
comment
Здравствуйте, вы нашли какое-нибудь решение? У меня такая же проблема. Спасибо.   -  person DzeryCZ    schedule 04.09.2014
comment
@DzeryCZ Я думаю, что вторая половина моего вопроса - это решение (т. Е. test.done() должно быть выполнено в функции run(), и вы должны определить хотя бы одно утверждение). Чего я до сих пор не понимаю, так это почему это важно :-)   -  person Darren Cook    schedule 04.09.2014
comment
спасибо за ваше решение. Я предполагаю, что причина как-то связана с порядком вызова этих обратных вызовов. Вероятно, есть некоторые вещи для очистки, такие как закрытие всех веб-страниц в конце casper.run до того, как будет выполнен заданный обратный вызов, который в противном случае был бы вызван не по порядку. .   -  person encrest    schedule 08.01.2015


Ответы (1)


Ваш последний then() (содержащий вызов done()) не вполне закончен, когда вызывается done() — у него все еще есть еще одна функция для вызова.

С другой стороны, функция run() выполняет свой обратный вызов, когда все предыдущие шаги полностью завершены. Из документов: «вы можете рассматривать как настраиваемый последний шаг, который нужно выполнить, когда все остальные шаги выполнены».

В большинстве случаев это не должно иметь значения, так как done(), вероятно, является последним шагом вашего окончательного then. Это может иметь значение, например, если done проверит, что все шаги выполнены.

Источник: http://casperjs.readthedocs.org/en/latest/modules/casper.html#run

person psimyn    schedule 04.09.2015