responseTime在Mockjax中不起作用

时间:2014-11-25 10:20:37

标签: javascript ajax casperjs mockjax

我需要模拟一个长响应时间。我的Moockjax正在运行 - 它提供了正确的模拟数据。但是我的ajax调用是在第二次加载页面时完成的,即使我将responseTime设置为20秒。

你知道吗?

我将测试页面减少到最低限度,以排除其他潜在的错误来源:

<!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

我还写了一篇关于它的博客文章here

2 个答案:

答案 0 :(得分:2)

Mockjax目前无法阻止延迟。请参阅current code

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

您需要指定async: true才能生效。当你这样做时,你需要在casper上下文中等待,因为控制流将继续而不等待结果。

casper.start(url, yourEvaluateFunction).wait(25000).run();

我不认为,除了以某种方式做忙碌之外,JavaScript甚至可以实现阻塞延迟。但是在这段时间里,其他一切都会停滞不前(JavaScript是单线程的),而你却无法从繁忙的地方获得任何东西。

答案 1 :(得分: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或更高版本才能获得此功能!