2013-05-30 2 views
2

Я использую Jasmine с PhantomJS для запуска тестовых примеров.Тайм-аут PhantomJs

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

Некоторые запросы могут быть возвращены через несколько секунд, а некоторые могут занять до минуты.

При запуске PhantomJS тестовый пример не работает для служебного вызова, который должен занять минуту (сбой, поскольку ответ еще не получен).

Интересно, что тест проходит при запуске Firefox.

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

У кого-нибудь была аналогичная проблема? Любые идеи относительно того, где можно было настроить тайм-аут? Или вы считаете, что проблема - это что-то еще?

ответ

1

Ah боль от PhantomJS.

По-видимому, оказалось, что я использовал функцию bind javascript, которая не поддерживается в PhantomJS. Это привело к сбою теста, который привел к испорчению состояния какой-либо глобальной переменной (моя ошибка) и, следовательно, к сбою.

Но основная причина заключалась в использовании bind.

Решение: попробуйте получить подкладку для bind, как это от https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind

if (!Function.prototype.bind) { 
    Function.prototype.bind = function (oThis) { 
    if (typeof this !== "function") { 
     // closest thing possible to the ECMAScript 5 internal IsCallable function 
     throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); 
    } 

    var aArgs = Array.prototype.slice.call(arguments, 1), 
     fToBind = this, 
     fNOP = function() {}, 
     fBound = function() { 
      return fToBind.apply(this instanceof fNOP && oThis 
           ? this 
           : oThis, 
           aArgs.concat(Array.prototype.slice.call(arguments))); 
     }; 

    fNOP.prototype = this.prototype; 
    fBound.prototype = new fNOP(); 

    return fBound; 
    }; 
} 
1

У меня был точно такой же вопрос. Все, что вам нужно сделать, это добавить setTimeout для выхода

setTimeout(function() {phantom.exit();},20000); // stop after 20 sec (add this before you request your webpage) 

page.open('your url here', function (status) { 
    // operations here 
});