9

関数を使用して webapi からデータを取得しています。基本的に使用し$.ajaxます。

私は今、waits()次のようにテストしています:

describe('xxxxxxxxxxxxxxxxxxxxx', function () {
  var r;
  it('fetchFilter', function () {
    runs(function () {
      model.fetch(opts)
      .done(function(data) {
        r = data;
      });
    });

    waits(2000);

    runs(function () {
      expect(r[0].gender).toBeDefined();
    });
  });
});

問題は:

  1. うまく機能するという保証はありませんwaits(2000)。さまざまな理由 (ネットワーク接続、API 自体のアルゴリズム効率など) により、1waits(5000)つ以上の必要がある場合や、モデルwaits(500)によってはそれで十分な場合があります。そして最も厄介なことは、それがすべて制御不能であることです。
  2. test-specs-runs の多くwaits()は、待機に多くの時間を無駄にします。スイート全体を実行する時間は、受け入れるには長すぎます。

そのようなことをしていることはありbest practiceますか?

PS: webapi またはデータベースに依存する一部の機能に単体テストを適用すべきではないことはわかっています。しかし、私は single-page-js-heavy-webapp を使用しています。データ フェッチ プロセスは、js モデルでそれらをどのように使用するかと同じくらい重要です。

4

3 に答える 3

12

waitsFor()指定されたラッチコールバックが戻るのを待ちますtrue(数ミリ秒ごとに何度も試行します)。また、指定されたタイムアウト(この場合は5000ms)を超えると、例外が発生します。

describe('xxxxxxxxxxxxxxxxxxxxx', function () {
  var r, fetchDone;

  it('fetchFilter', function () {

    runs(function () {
      model.fetch(opts).done(function(data) {
        r = data;
        fetchDone = true;
      });
    });

    waitsFor(function() { 
      return fetchDone; 
    }, 5000); 

    runs(function () {
      expect(r[0].gender).toBeDefined();
    });

  });
});

およびの詳細については、 Jasmineのドキュメントを確認してください。waitsFor()runs()

于 2013-01-14T10:11:39.433 に答える
2

次の解決策では、本当に必要なだけ待つことができますが、それでも十分と思われる最大タイムアウトを定義する必要があります。は関数を受け取り、関数が戻るか、最後の引数の期限が切れたときにタイムアウトが経過するwaitsForまで待機します。trueそれ以外の場合は失敗します。

あなたが待つ必要があるものがr[0]まったく定義されていると仮定すると、それは次のようになります:

waitsFor(
    function() { return r[0]; },
    'the data should be already set',
    5000);
于 2013-01-14T10:02:41.860 に答える