我使用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
答案 0 :(得分:17)
waitsFor
会阻止它等待的条件或超时。
来自jasmine docs:“waitsFor()提供了一个更好的界面来暂停你的规范,直到其他一些工作完成.Masmine将等到提供的函数返回true,然后继续下一个块。”。
链接的文档也有一个更清晰的示例或waitsFor
。
编辑:啊,我明白你的意思了。 waitsFor
不会阻止未包含在runs
,waitsFor
中的JS,等等。
茉莉正在做的是通过runs
或waitsFor
传递给它的函数,如果jasmine当前没有等待,它会立即执行该函数。如果等待,则在等待完成之前不会调用它。
这不会阻止console.log
传递给茉莉花,因此茉莉花不能阻止它被立即执行。
答案 1 :(得分:4)
解决方案在文档中:
规范中的多个run()块将以串行方式运行。 (Jasmine Documentation)
答案 2 :(得分:2)
Jasmine将按您的顺序调用runs()和waitsFor()方法 通过他们。一旦JS解析器到达waitsFor()方法就可以了 将轮询它直到它返回true,然后才会继续 下一个run()方法。
本质上,runs()和waitsFor()函数填充了一个带有它们提供的函数的数组。然后通过jamine处理该阵列,其中顺序地调用这些函数。 run()注册的那些函数应该执行实际工作,而waitsFor()注册的函数应该是'latch'函数,并且每10ms轮询(调用)一次,直到它们返回true或者可选的注册超时期限到期为止。如果超时期限到期,则使用可选的已注册错误消息报告错误;否则,该过程继续进行数组中的下一个函数。据推测,在runs()中的期望也可以触发失败报告(甚至可能在锁存函数本身中)。
文档对这些异步功能特别迟钝。