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

Javascript 如何使用jasmine测试需要很长时间才能响应的异步函数?,javascript,jasmine,Javascript,Jasmine,我正在使用一个函数从webapi获取数据。基本上使用$.ajax 我现在用waits()测试它,如下所示: describe('xxxxxxxxxxxxxxxxxxxxx', function () { var r; it('fetchFilter', function () { runs(function () { model.fetch(opts) .done(function(data) { r = data; });

我正在使用一个函数从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();
    });
  });
});
问题是:

  • 不能保证
    waits(2000)
    会做好这项工作。由于各种原因(网络连接、api自身的算法效率等),我可能不得不等待(5000)或更多,或者对于某些型号
    等待(500)
    就足够了。最恼人的是,一切都失控了
  • 大量的
    等待()
    使测试规范运行浪费了大量的等待时间。运行整个套件的时间太长,无法接受
  • 是否有做这类事情的
    最佳实践


    PS:我知道单元测试不应该应用于依赖webapi或数据库的函数。但我正在使用一个单页js重的Web应用程序。数据获取过程与我将如何使用js模型一样重要。

    以下解决方案允许您只等待实际需要的时间,但您仍然必须定义您认为足够的最大超时时间。
    waitsFor
    接受函数并等待,直到它返回
    true
    或最后一个参数过期时传递的超时。否则它就失败了

    假设您需要等待的是定义了
    r[0]
    ,它可能是:

    waitsFor(
        function() { return r[0]; },
        'the data should be already set',
        5000);
    
    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();
        });
    
      });
    });
    
    有关()和
    运行()

    的更多信息,请参见,您可以为
    传递额外的参数(“场景”,回调,超时)


    何时显示“故障信息”?超时会打印自己的错误消息。如果未指定失败消息,则会显示默认超时消息。如果您需要自定义消息,可以使用
    waitsFor(function(){return fetchDone;},“在等待提取完成时超时,等等”,5000)
    waitsFor
    在jasmine2中不可用。@Gurpreet和
    waits
    也不可用。如果我在单击登录按钮时遇到问题,没有执行任何操作,我可以让specefic等待jasmine framework,因为现在即使没有显示onclick效果,也不会发生任何事情?
    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);