21

我使用 jasmine 运行并等待测试异步操作。一切正常,但我不太确定幕后发生了什么。

茉莉花文档说明了以下示例,我在其中添加了三个日志语句。

describe("Asynchronous specs", function() {
  var value, flag;

  it("should support async execution of test preparation and exepectations", function() {

    runs(function() {
      flag = false;
      value = 0;

      setTimeout(function() {
        flag = true;
      }, 500);
    });

    waitsFor(function() {
      value++;
      if(flag) {
          console.log("A");
      }
      return flag;
    }, "The Value should be incremented", 750);

    console.log("B");

    runs(function() {
      console.log("C");
      expect(value).toBeGreaterThan(0);
    });
  });
});

});

第一个对我runs来说waitsFor非常清楚。Runs启动异步操作并waitsFor等待条件。

但是我不明白为什么第二个runs直到waitsFor完成才开始。这waitsFor不是阻塞调用。

我的猜测是waitsFor隐式阻止任何后续runs调用,直到它完成。是这样吗?

我的证据是 console.log 语句输出:

BAC

但如果waitsFor真的会阻止它应该是

美国广播公司

4

3 回答 3

19

waitsFor确实阻塞,直到它等待的条件得到满足或超时。

来自jasmine 文档:“waitsFor() 提供了一个更好的接口,用于暂停您的规范,直到完成其他一些工作。Jasmine 将等到提供的函数返回 true,然后再继续下一个块。”。

链接的文档也有一个更清晰的示例或waitsFor.

编辑:啊,我明白你现在的意思了。waitsFor不会阻止未包含在runs,等中的 JS waitsFor

jasmine 正在做的是将函数通过runsor传递给它waitsFor,如果 jasmine 当前没有等待,它会立即执行该函数。如果它正在等待,它不会调用它,直到它完成等待。

这并不能阻止它,console.log因为它已被传递给 jasmine,因此 jasmine 无法阻止它立即被执行。

于 2013-05-06T15:25:21.517 回答
4

解决方案在文档中:

规范中的多个 runs() 块将连续运行。(茉莉花文档

于 2013-05-06T15:50:11.933 回答
3

从网站:http ://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=mzNDUVfhFXg

Jasmine 将按照您传递它们的顺序调用 runs() 和 waitsFor() 方法。一旦 JS 解析器到达 waitsFor() 方法,它就会轮询它,直到它返回 true,然后才会继续执行下一个 runs() 方法。

本质上,runs() 和 waitsFor() 函数用它们提供的函数填充一个数组。然后数组由 jamine 处理,其中函数被顺序调用。那些由 runs() 注册的函数预计将执行实际工作,而那些由 waitsFor() 注册的函数预计将是“闩锁”函数,并将每 10 毫秒轮询(调用)一次,直到它们返回 true 或可选的注册超时期限到期。如果超时期限到期,则使用可选的注册错误消息报告错误;否则,该过程继续数组中的下一个函数。据推测,runs() 中的期望也可以触发失败报告(甚至可能在闩锁函数本身中)。

文档对这些异步功能特别迟钝。

于 2013-08-13T16:26:23.467 回答