Javascript 为什么要用茉莉花';s运行并等待函数是否需要?

Javascript 为什么要用茉莉花';s运行并等待函数是否需要?,javascript,angularjs,unit-testing,asynchronous,jasmine,Javascript,Angularjs,Unit Testing,Asynchronous,Jasmine,我正在用如下内容测试一段异步代码: randomService.doSomething().then(function() { console.log('I completed the operation!'); }); 令人惊讶的是(对我来说),我发现它只有在包装在jasmine的运行函数时才会成功(即显示console.log输出),如下所示: var isDone = false; runs(function() { randomService.doSomething(

我正在用如下内容测试一段异步代码:

randomService.doSomething().then(function() {
    console.log('I completed the operation!');
});
令人惊讶的是(对我来说),我发现它只有在包装在jasmine的
运行
函数时才会成功(即显示console.log输出),如下所示:

var isDone = false;

runs(function() {
    randomService.doSomething().then(function(data) {
        console.log('I completed the operation!');
        isDone = true;
    });
});

waitsFor(function() {
    return isDone;
}, 'Operation should be completed', 1000);
据我所知,我认为,
waitsFor
只是延迟代码,换句话说,如果我有更多的代码必须延迟到异步调用完成后,我会使用它——换句话说,我会认为我没有理由使用
运行
等待
,因为这段代码后面没有任何东西,对吗?这就是我从阅读这个问题中得到的印象:但很明显,我在某个时候把自己搞糊涂了

有人对此有什么想法吗


编辑: 下面是一个Plunker,它提供了问题的更多细节:

注意第一个测试总是通过,第二个测试应该失败。
另外,我肯定我以前应该提到过这一点,但这是使用angularJS和Jasmine 1.3。

这正是Jasmine的工作原理。您链接的问题有一个合理解释的答案:

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

总而言之,每个
等待
调用必须有一个相应的
运行
调用。他们一起工作。在没有
的情况下调用
waitsFor
会在没有意义之前在某处运行
调用


我的修订版plunker(参见对该答案的评论):

如您所见,我添加了
$rootScope.$apply()
指向您正在测试的超时函数。这使得promise回调中的
console.log
运行。但是,只有当您忽略另一个带有
xit
的测试,并且
console.log
之后的
expect
似乎没有被识别为Jasmine测试时,它才会运行(尽管它肯定必须运行,因为
console.log
确实如此)

非常奇怪-我真的不明白为什么会发生这种情况,但我认为这与Jasmine如何在幕后工作、如何注册测试等等有关。我在这一点上的理解是,如果在异步回调中有一个
expect
,Jasmine将不会“识别”它作为测试套件的一部分,除非初始异步调用是在
运行的
中进行的


至于这是为什么,我不知道。我认为这不值得尝试去理解——我只需要使用
运行
等待
就可以了,不用担心,但这就是我。如果你感到受虐狂,你总是可以从源头挖掘。很抱歉,我帮不上什么忙。

我想我找到了问题所在。以下是文章:

本质上这是必要的,因为Jasmine不会在完成测试之前等待异步调用完成。根据这篇文章,如果一个调用需要足够长的时间,并且以后会有更多的测试,那么在先前测试中的异步回调中的
expect
语句最终可能会在原始测试完成后在另一个测试中完全执行


使用
运行
等待
解决问题,因为它们迫使jasmine等待
等待完成后再进行下一个测试;然而,这是一个没有实际意义的观点,因为显然Jasmine 2.0以比1.3更好的方式解决异步测试,淘汰了
运行
等待
这部分我有点理解,但我主要看不到的是为什么首先必须使用
运行
等待
。我只是不明白为什么没有它们代码就不能工作-你能给我解释一下这部分吗?当你没有它们运行代码时会发生什么
waitsFor
允许您以“jasmine”方式测试未知错误和超时。通常,我的
等待函数除了返回bool之外什么都不做。我的承诺设置bool取决于服务返回的数据是否正确。这是奇怪的部分-如果我运行jasmine测试而不使用
runs
,则回调函数中的任何内容都不会执行。但是,如果我在测试环境之外运行代码,它工作得很好,这就是为什么我对Jasmine在这里做的事情感到困惑的原因之一。哦,我明白你的意思了。控制台日志没有显示?我怀疑代码正在运行,但jasmine没有看到控制台日志-因为您没有使用
运行
。不是100%确定这是什么原因,但我知道对
运行的调用是一个单独的测试块。我只会使用
运行
并微笑,因为茉莉花很奇怪。顺便说一句,如果您使用的是无头浏览器,请尝试chrome并查看控制台日志是否出现。我猜代码可能正在运行,但我不这么认为-当我尝试进行一项保证失败的测试时(即
expect(true)。toBe(false)
测试仍然通过,因此我认为它可能根本无法运行。我肯定在使用
运行
(我必须让我的代码正常工作)但如果能知道为什么会这样,那就太好了——我无法忍受编写我不完全理解的代码……如果我可以建议的话——现在摩卡已经有了本地的承诺支持,那么在我看来,在承诺中使用茉莉花真的没有什么好的理由。@Benjamin Grunbaum嗯,我当然愿意尝试新的东西,我是真的