【问题标题】:What do jasmine runs and waitsFor actually do?jasmine 运行和等待实际上是做什么的?
【发布时间】:2013-04-30 06:50:48
【问题描述】:

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

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 语句输出:

B A C

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

A B C

【问题讨论】:

    标签: javascript unit-testing jasmine


    【解决方案1】:

    来自网站: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() 中的期望也可以触发失败报告(甚至可能在闩锁函数本身中)。

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

    【讨论】:

    • Jasmine 1.3 提供了waitsFor-methods(不是waitFor),答案应该更正了。
    【解决方案2】:

    解决方案在文档中:

    一个规范中的多个 runs() 块将连续运行。 (Jasmine Documentation)

    【讨论】:

      【解决方案3】:

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

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

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

      编辑:啊,我明白你的意思了。 waitsFor 不会阻止没有包裹在 runs、waitsFor 等中的 JS。

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

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

      【讨论】:

      • 我很确定情况并非如此。您在waitsFor 和第二个run 之间放置了一条语句,它将在waitsFor 中的代码之前执行,我将更新我的问题以反映这一点。
      • 但是感谢文档的链接,我不知道 :)
      • 再次感谢,答案在文档中,但不是你指出的地方:)
      • 'waitsFor' 不仅会阻塞直到满足条件,还会每 10ms 运行一次传递给它的函数内部的代码。记住这一点很有用。 htmlgoodies.com/beyond/javascript/…
      猜你喜欢
      • 2018-11-29
      • 2013-05-21
      • 1970-01-01
      • 2011-03-11
      • 2010-11-26
      • 2015-06-23
      • 2017-12-26
      • 2016-10-19
      • 1970-01-01
      相关资源
      最近更新 更多