2

テストケースを実行するために、PhantomJS で Jasmine を使用しています。

私の典型的なテスト ケースでは、サービス コールを行い、応答を待って応答を確認します。

数秒で返されるリクエストもあれば、返されるまでに最大 1 分かかるリクエストもあります。

PhantomJS を実行すると、1 分かかるはずのサービス呼び出しでテスト ケースが失敗します (応答がまだ受信されていないため失敗します)。

興味深いのは、Firefox で実行したときにテストがパスすることです。

tcpdump を調べてみましたが、ヘッダーは両方のブラウザからのリクエストで同じであるため、これはブラウザのタイムアウトの問題のようです。

誰かが同様の問題を抱えていますか? タイムアウトをどこで設定できるかについてのアイデアはありますか? それとも、問題は別のものだと思いますか?

4

2 に答える 2

1

まったく同じ問題がありました。終了するには setTimeout を追加するだけです

 setTimeout(function() {phantom.exit();},20000); // stop after 20 sec ( add this before you request your webpage )

 page.open('your url here', function (status) {
  // operations here
 });
于 2014-10-01T08:48:50.483 に答える
1

ああ、PhantomJS の痛み。

bindどうやらPhantomJS でサポートされていないjavascript の関数を使用していたことが判明しました。これにより、テストが失敗し、グローバル変数の状態が台無しになり(私の障害)、失敗しました。

しかし、根本的な原因はbind.

解決策: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bindbindからこのような シムを取得してみてください

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}
于 2013-05-31T21:18:54.510 に答える