我使用jasmine run和wait来测试异步操作。一切都很好,但我不太确定幕后发生了什么。
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);
});
});
});
});
第一个runs
和waitsFor
对我来说非常清楚。Runs
启动一个异步操作,waitsFor
等待一个条件。
然而,我不明白为什么第二个runs
直到waitsFor
完成后才启动。waitsFor
不是阻塞调用。
我的猜测是waitsFor
会隐式地阻塞后面的任何runs
调用,直到它完成为止。是这样吗?
我的证据是console.log语句输出:
B、A、C
但如果waitsFor
真的想阻止它,它应该是
A、B、C
发布于 2013-05-06 23:25:22
waitsFor
确实会阻塞,直到它等待的条件得到满足或超时。
在jasmine docs中:"waitsFor()提供了一个更好的接口来暂停您的规范,直到其他工作完成。Jasmine将等待所提供的函数返回true,然后再继续下一个代码块。“
链接的文档也有一个稍微清晰的示例或waitsFor
。
编辑:啊,我现在明白你的意思了。waitsFor
不会阻止没有包装在runs
、waitsFor
等中的JS。
jasmine正在做的是获取通过runs
或waitsFor
传递给它的函数,如果jasmine当前没有等待,它会立即执行该函数。如果它正在等待,它不会调用它,直到完成等待。
这并不能阻止console.log
,因为它已经传递给了jasmine,所以jasmine不能阻止它立即被执行。
发布于 2013-05-06 23:50:12
发布于 2013-08-14 00:26:23
runs将按照您传递的顺序调用
()和waitsFor()方法。一旦JS解析器获得waitsFor()方法,它就会对其进行轮询,直到返回true,然后才会继续执行下一个runs()方法。
本质上,runs()和waitsFor()函数用它们提供的函数填充数组。然后,该数组由jamine处理,其中函数被顺序调用。由runs()注册的那些函数应该执行实际的工作,而由waitsFor()注册的那些函数应该是“闩锁”函数,并且将每10ms轮询(调用)一次,直到它们返回true或可选的注册超时期限到期。如果超时时间到期,则使用可选的已注册错误消息报告错误;否则,该过程将继续执行数组中的下一个函数。据推测,run()中的expect也会触发失败报告(甚至可能是在闩锁函数本身中)。
文档中对这些异步特性的描述特别生硬。
https://stackoverflow.com/questions/16400047
复制相似问题