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本身的算法效率等),我可能不得不waits(5000)或更多,或者对于某些模型waits(500)来说已经足够了。而最烦人的是,一切都失控了。
  2. 很多waits()使测试规范运行浪费大量时间等待。运行整个套件的时间太长,无法接受。

有没有一些best practice做那里的事情?

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

4

3 回答 3

12

waitsFor()将等待指定的闩锁回调返回true(它会每隔几毫秒尝试多次)。如果超过指定的超时时间(在这种情况下为 5000 毫秒),它也会引发异常。

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 回答
-1

根据jasmine 2.5,您可以为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);
于 2017-02-14T06:23:28.753 回答