2016-02-16 8 views
1

Я пытаюсь написать модульные тесты с помощью Zombie.js. Моя проблема заключается в том, что запросы AJAX не заканчиваются при запуске с использованием browser.evaluate, хотя они выполняются отлично, если они включены на странице с тегом скрипта.zombie.js-triggered запросы AJAX не заполняются

У меня есть три файла:

  • index.html: HTML-страница, которая загружает зомби
  • hello.txt: обычный текстовый файл с содержимым hello, world
  • main.js: в zombie.js программу, которая загружает index.html

index.html и hello.txt are s с использованием команды python -m SimpleHTTPServer 8009. (обратите внимание, что я использую dev.local, что является синонимом для 127.0.0.1 в файле моих хостов)

Адрес index.html. Он делает запрос AJAX для получения hello.txt. Это прекрасно работает:

<!DOCTYPE html> 
<html lang='en'> 
<head> 
    <meta charset='UTF-8' /> 
    <title></title> 
</head> 
<body> 
    <script type='text/javascript' src='https://code.jquery.com/jquery-2.2.0.min.js'> 
    </script> 
    <script type='text/javascript'> 
    $.support.cors = true; 
    var doRequest = function(msg) { 
     $.support.cors = true; 
     return $.ajax({ 
     url: "http://dev.local:8009/hello.txt", 
     success: function(v) { console.log("success ", msg, v); } 
     }); 
    }; 
    </script> 
    <script type="text/javascript"> 
    console.log("page loaded");                                      
    doRequest('script'); 
    </script> 
</body> 
</html> 

Вот main.js. Он перемещается в index.html и пытается оценить функцию doRequest, которая должна вызывать запрос AJAX. Тем не менее, запрос никогда не завершается, а вместо этого истекает время.

var Browser = require("zombie"); 
const browser = new Browser({debug: true}); 
const rootURL = "http://dev.local:8009/" 

browser.visit(rootURL, function(err) {                                    
    browser.evaluate('console.log("browser.evaluate ✔");'); 
    browser.evaluate('doRequest("zombie");'); 
}); 

Вот бревно от работы DEBUG=zombie node ./main.js:

zombie Opened window http://dev.local:8009/ +0ms 
    zombie GET http://dev.local:8009/ => 200 +38ms 
    zombie Loaded document http://dev.local:8009/ +36ms 
    zombie GET https://code.jquery.com/jquery-2.2.0.min.js => 200 +55ms 
page loaded 
    zombie XHR readystatechange http://dev.local:8009/hello.txt +64ms 
    zombie XHR loadstart http://dev.local:8009/hello.txt +1ms 
    zombie GET http://dev.local:8009/hello.txt => 200 +9ms 
    zombie XHR readystatechange http://dev.local:8009/hello.txt +1ms 
    zombie XHR readystatechange http://dev.local:8009/hello.txt +0ms 
    zombie XHR readystatechange http://dev.local:8009/hello.txt +1ms 
    zombie XHR progress http://dev.local:8009/hello.txt +0ms 
success script hello, world 

    zombie XHR load http://dev.local:8009/hello.txt +2ms 
    zombie XHR loadend http://dev.local:8009/hello.txt +0ms 
    zombie Fired setTimeout after 0ms delay +1ms 
    zombie Event loop is empty +0ms 
browser.evaluate ✔ 
    zombie XHR readystatechange http://dev.local:8009/hello.txt +4ms 
    zombie XHR loadstart http://dev.local:8009/hello.txt +0ms 
    zombie GET http://dev.local:8009/hello.txt => 200 +6ms 

Как ни странно, зомби, кажется, на самом деле завершения запроса: в последней строке журнала показывает, что ответ HTTP 200 был получен, но событие никогда не было передано обработчику.

Почему запрос, инициированный зомби, не выполнен правильно?

ответ

0

я получил тот же вопрос с zombie.js и поэтому я посмотрел на источник и нашел следующие строки:

// -- Event processing -- 

// Grabs next event from the queue, processes it and notifies all listeners. 
// Keeps processing until the queue is empty or all listeners are gone. You 
// only need to bootstrap this when you suspect it's not recursing. 
//... more lines ... 
// Is there anybody out there? 
if (this.waiting === 0) 
    return; 

поэтому никаких событий не уволят, если никто не ждет вам нужно добавить browser.wait()

browser.visit(rootURL, function(err) {                                    
    browser.evaluate('console.log("browser.evaluate ✔");'); 
    browser.evaluate('doRequest("zombie");'); 
    browser.wait(); 
}); 
Смежные вопросы