1

我需要模拟很长的响应时间。我的 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 秒内给了我这个输出:

模拟输出

我还在这里写了一篇关于它的博客文章。

4

2 回答 2

2

Mockjax 目前无法进行阻塞延迟。查看当前代码

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 是单线程的),你不会从忙等待中得到任何东西。

于 2014-11-25T15:01:05.520 回答
1

是的,@artjom-b 是正确的。我们还没有responseTime为非异步请求实现,因为在代码执行方面确实没有理由(也就是说,ajax 请求在任何情况下都不会是异步的,那为什么会延迟呢?)。也就是说,您可以实现一个response函数(而不是使用responseText),然后使用简单的 setTimeout() 和我们新的异步响应功能强制延迟:

$.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 或更高版本才能获得此功能!

于 2014-11-25T16:22:11.900 回答