21

私はジャスミンの実行を使用し、非同期操作のテストを待ちます。すべてが正常に機能しますが、舞台裏で何が起こっているのかよくわかりません。

ジャスミンのドキュメントには、3 つのログ ステートメントを追加した次の例が記載されています。

describe("Asynchronous specs", function() {
  var value, flag;

  it("should support async execution of test preparation and exepectations", function() {

    runs(function() {
      flag = false;
      value = 0;

      setTimeout(function() {
        flag = true;
      }, 500);
    });

    waitsFor(function() {
      value++;
      if(flag) {
          console.log("A");
      }
      return flag;
    }, "The Value should be incremented", 750);

    console.log("B");

    runs(function() {
      console.log("C");
      expect(value).toBeGreaterThan(0);
    });
  });
});

});

最初のrunswaitsForは私には完全に明らかです。Runs非同期操作を開始waitsForし、条件を待ちます。

runsただし、終了するまで2番目が開始されない理由がわかりませんwaitsFor。はwaitsForブロッキング コールではありません。

私の推測では、終了するまでwaitsFor後続の呼び出しを暗黙的にブロックします。runsそうですか?

私の証拠は、console.log ステートメントが出力することです。

BAC

しかし、waitsFor本当にブロックする場合は、そうする必要があります

ABC

4

3 に答える 3

3

サイトから: http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=mzNDUVfhFXg

Jasmine は、runs() メソッドと waitsFor() メソッドを、渡された順序で呼び出します。JS パーサーが waitsFor() メソッドに到達するとすぐに、true が返されるまでそれをポーリングし、それから次の runs() メソッドに進みます。

基本的に、runs() および waitsFor() 関数は、提供された関数を配列に詰め込みます。次に、配列はjamineによって処理され、関数が順次呼び出されます。runs() によって登録された関数は実際の作業を実行することが期待されますが、waitsFor() によって登録された関数は「ラッチ」関数であることが期待され、true を返すか、オプションで登録されたタイムアウト期間が経過するまで 10 ミリ秒ごとにポーリング (呼び出され) されます。タイムアウト期間が満了すると、オプションの登録済みエラー メッセージを使用してエラーが報告されます。それ以外の場合、プロセスは配列内の次の関数に進みます。おそらく、runs() 内の expect も失敗レポートをトリガーする可能性があります (おそらくラッチ関数自体でも)。

ドキュメントは、これらの非同期機能について特にわかりにくいです。

于 2013-08-13T16:26:23.467 に答える