簡體   English   中英

如何使用jasmine來測試需要很長時間才能響應的異步函數?

[英]How to use jasmine to test an async function that takes a long time to respond?

我正在使用一個函數從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)能很好地完成工作。 由於各種原因(網絡連接,自身的算法效率等),我可能必須waits(5000)或更多,或者對於某些模型waits(500)就足夠了。 最令人討厭的是它完全失控。
  2. 很多waits()使測試規范 - 運行浪費了大量的時間等待。 運行整個套件的時間太長,無法接受。

有沒有best practice做那種事情?

PS:我知道單元測試不應該應用於某些依賴webapi或數據庫的函數。 但我正在使用單頁js-heavy-webapp。 數據獲取過程與我如何使用js模型一樣重要。

waitsFor()將等待指定的latch回調返回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();
    });

  });
});

有關waitsFor()runs()更多信息,請查看Jasmine文檔

以下解決方案允許您等待不超過真正必要但仍然必須定義您認為足夠的最大超時。 waitsFor接受該函數並等待它返回true或者在最后一個參數到期時傳遞超時。 否則它會失敗。

假設你需要等待的是r[0]被定義,它可能是:

waitsFor(
    function() { return r[0]; },
    'the data should be already set',
    5000);

根據jasmine 2.5 ,你可以為it("scenario", callback, timeout)傳遞一個額外的參數it("scenario", callback, timeout)

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

  it('fetchFilter', function () {

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

    setTimeout(function() {
        done();
    }, 9000); 

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

  });
},10000);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM