Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jasmine跑步和等待到底是做什么的?_Javascript_Unit Testing_Jasmine - Fatal编程技术网

Javascript jasmine跑步和等待到底是做什么的?

Javascript jasmine跑步和等待到底是做什么的?,javascript,unit-testing,jasmine,Javascript,Unit Testing,Jasmine,我使用jasmine运行并等待测试异步操作。一切正常,但我不太清楚幕后发生了什么 jasmine文档说明了我添加了三个log语句的以下示例 describe("Asynchronous specs", function() { var value, flag; it("should support async execution of test preparation and exepectations", function() { runs(function() {

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

jasmine文档说明了我添加了三个log语句的以下示例

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);
    });
  });
});
}))

第一次运行和等待对我来说非常清楚<代码>运行启动异步操作并等待等待条件

但是,我不明白为什么第二个
运行
直到
等待
完成后才开始。
waitsFor
不是阻塞调用

我猜想,
waitsFor
会隐式阻止任何后续的
运行
调用,直到调用完成。是这样吗

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

B A C

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


等待的B C会一直阻塞,直到它等待的条件得到满足或超时为止

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

链接的文档也有一个稍微清晰的示例或
等待

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

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


这不会停止控制台的运行,因为它已经传递给jasmine,所以jasmine无法阻止它立即执行。

解决方案在文档中:

等级库中的多个runs()块将连续运行。()

从网站:

Jasmine将按照您指定的顺序调用runs()和waitsFor()方法 通过他们。一旦JS解析器到达waitsFor()方法,它就会 将轮询它,直到它返回true,然后才继续 next runs()方法

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


文档中对这些异步特性的描述特别迟钝。

我很确定情况并非如此。您在
waitsFor
和第二次
run
之间放置了一条语句,它将在
waitsFor
中的代码之前执行。我将更新我的问题以反映这一点。但感谢指向文档的链接,我不知道:)再次感谢,答案在文档中,但不完全是您所指的:)“waitsFor”不仅会阻塞直到满足条件,而且还会在传递给它的函数中每隔10毫秒运行一次代码。记住这一点很有用。Jasmine 1.3提供了waitsFor方法(而不是waitFor),答案应该被更正。