如何使用jasmine来测试需要很长时间才能响应的异步函数?

hbr*_*rls 9 javascript jasmine

我正在使用一个函数从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();
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

问题是:

  1. 我们无法保证能够waits(2000)很好地完成工作.由于各种原因(网络连接,api it self的算法效率等),我可能要waits(5000)或者更多,或者对于某些模型waits(500)来说已经足够了.最令人讨厌的是它完全失控.
  2. 很多waits()因为测试规范浪费了很多时间等待.运行整个套件的时间太长,无法接受.

有没有best practice做过那种事情?

PS:我知道单元测试不应该应用于某些依赖webapi或数据库的函数.但我正在使用单页js-heavy-webapp.数据获取过程与我如何使用js模型一样重要.

ist*_*iuk 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();
    });

  });
});
Run Code Online (Sandbox Code Playgroud)

有关和的更多信息,请查看Jasmine文档waitsFor()runs()

  • `waitsFor`在jasmine2中不可用. (8认同)