2014-11-25 2 views
1

Мне нужно смоделировать длительный отклик. Мой Moockjax работает - он доставляет правильные данные. Но мой вызов ajax выполняется во второй загрузке страницы, даже если я установил responseTime на 20 секунд.responseTime не работает в Mockjax

У вас есть идея?

я уменьшил свою тестовую страницу к минимуму, чтобы исключить другие возможные источники ошибок здесь:

<!DOCTYPE HTML> 
<html> 
<head> 
    <script src="jquery.js"></script> 
    <script src="../jquery.mockjax.js"></script> 
    <title>MockJax Tests</title> 
    </head> 
<body> 
    <h1>A MockJax test.</h1> 
    <p>Take a look into the console.</p> 
    <script> 

     $.mockjax({ 
      url: "foo.html", 
      responseTime: 20000, 
      responseText: "Hi! I am mockjax." 
     }); 

     $.ajax({ 
      async: false, 
      url: 'foo.html', 
      success:function(data){ 
      console.log(data); 
      }, 
      error:function(data){ 
      console.log('It doesn’t work that way :('); 
      } 
     }); 

    </script> 
</body> 
</html> 

Я также написал тест с CasperJS и Mockjax (внутри casper.evaluate). Это то же самое.

Вот мой CasperJS код

var casper = require("casper").create({ 
    verbose: true, 
    logLevel: 'error', 
    clientScripts: ["node_modules/jquery-mockjax/jquery.mockjax.js"] 
}); 

casper.on('remote.message', function(msg) { 
    this.echo('remote message caught: ' + msg); 
}) 

casper.start('http://der-zyklop.de/', function() { 
    this.evaluate(function() { 

    $.mockjax({ 
     url: "/blog/feed", 
     responseTime: 20000, 
     responseText: "Hi! I am mockjax!" 
    }); 

    $.ajax({ 
     async: false, 
     url: '/blog/feed', 
     success:function(data){ 
     console.log(data); 
     }, 
     error:function(data){ 
     console.log('It doesn’t work that way :('); 
     } 
    }); 

    }); 
}); 

casper.run(); 

Если у вас установлен CasperJS, вы должны быть в состоянии запустить его npm install jquery-mockjax, а затем casperjs test.js. Это дает мне этот выход в под 20 секунд:

mockjax output

Я также написал blogarticle об этом here.

+1

Какую версию jQuery вы используете? Если вы используете 2.x, вы можете попробовать понизить до 1.x –

+0

Спасибо за подсказку. Я попробовал это сейчас с 1.11.1 и 2.1.1. К сожалению, ничего не меняется. – DerZyklop

+0

@ArtjomB. Конечно. Нет проблем. Я добавил содержимое своего тестового файла CasperJS. – DerZyklop

ответ

2

В настоящее время Mockjax не способен блокировать задержку. Смотрите current code:

if (requestSettings.async === false) { 
    // TODO: Blocking delay 
    process(); 
} else { 
    this.responseTimer = setTimeout(process, parseResponseTimeOpt(mockHandler.responseTime) || 50); 
} 

Вам нужно будет указать async: true для этой работы. Когда вы это сделаете, вам нужно будет ждать в контексте, потому что поток управления будет продолжаться, не дожидаясь результата.

Я не думаю, что блокировка возможна даже с помощью JavaScript, кроме как-то с помощью busywait. Но за это время все остальное также будет стоять на месте (JavaScript однопоточный), и вы ничего не получите от занятой игры.

+0

Да, что TODO было там ДОЛГОЕ время. Прежде чем я взял код. Честно говоря, я не вижу необходимости в том, чтобы дать альтернативное решение, которое я предложил, но ... я открыт для этого. – jakerella

+0

давайте продолжим обсуждение вашего ответа. –

1

Да, @ artjom-b является правильным. Мы не внедрили responseTime для неасинхронных запросов, потому что на самом деле нет причин для выполнения кода (то есть, запрос ajax не будет асинхронным в любом случае, так почему же задержка?). Тем не менее, вы могли бы реализовать response функцию (вместо использования responseText), а затем заставить задержку с помощью простого SetTimeout() и наш новый async response functionality:

$.mockjax({ 
    url: 'foo.html', 
    response: function(settings, done) { // the "done" argument makes this async 
    var self = this; 
    setTimeout(function(){ 
     self.responseText = "Hi! I am mockjax."; 
     done(); // this ends the async action 
    }, 20000); // here is your 20 second delay 
    } 
}); 

ПРИМЕЧАНИЕ: Вам нужно будет использовать Mockjax 1.6. 0 или новее, чтобы получить эту функциональность!

+0

Используете ли вы последнюю версию Mockjax? Это было введено только в версии 1.6.0, которая не прошла долго.Асинхронная функциональность работает (как в наших собственных тестах, так и в моем коде). – jakerella

+0

;) Не стоит беспокоиться ... его «новая особенность! – jakerella

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