1

長い応答時間をシミュレートする必要があります。私の Moockjax は機能しており、適切なモック データを提供しています。しかし、responseTime を 20 秒に設定したとしても、私の ajax 呼び出しはページをロードした瞬間に行われます。

アイデアはありますか?

ここで他の潜在的なエラーの原因を除外するために、テスト ページを最小限に減らしました。

<!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();

npm install jquery-mockjaxCasperJS がインストールされている場合は、それから実行できるはずです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 に答える