茉莉花运行和等待实际上做什么?

时间:2013-05-06 13:40:53

标签: javascript unit-testing jasmine

我使用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);
    });
  });
});

});

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

但是我不明白为什么在runs完成之前第二个waitsFor没有开始。 waitsFor不是阻止通话。

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

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

B A C

但如果waitsFor真的会阻止它,那么

A B C

3 个答案:

答案 0 :(得分:17)

waitsFor会阻止它等待的条件或超时。

来自jasmine docs:“waitsFor()提供了一个更好的界面来暂停你的规范,直到其他一些工作完成.Masmine将等到提供的函数返回true,然后继续下一个块。”。

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

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

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

这不会阻止console.log传递给茉莉花,因此茉莉花不能阻止它被立即执行。

答案 1 :(得分:4)

解决方案在文档中:

  

规范中的多个run()块将以串行方式运行。 (Jasmine Documentation

答案 2 :(得分:2)

来自网站: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,然后才会继续   下一个run()方法。

本质上,runs()和waitsFor()函数填充了一个带有它们提供的函数的数组。然后通过jamine处理该阵列,其中顺序地调用这些函数。 run()注册的那些函数应该执行实际工作,而waitsFor()注册的函数应该是'latch'函数,并且每10ms轮询(调用)一次,直到它们返回true或者可选的注册超时期限到期为止。如果超时期限到期,则使用可选的已注册错误消息报告错误;否则,该过程继续进行数组中的下一个函数。据推测,在runs()中的期望也可以触发失败报告(甚至可能在锁存函数本身中)。

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