angularjs - Karma 单元测试在无限循环中一遍又一遍地运行

标签 angularjs karma-runner

我正面临这个问题,因为我创建了一堆新的指令测试(在 JHipster 项目中)。 karma 单元测试由 grunt 任务执行。
我想清楚地强调一下,我的问题与我在 GitHub 上发现的这两个(以及其他一些我不允许发布的)不同:

https://github.com/karma-runner/karma/issues/1077

https://github.com/karma-runner/karma/issues/393

不同之处在于 karma 永远不会执行测试,而是继续在循环中运行它们,就好像在配置的位置有无限数量的测试一样。在命令行输出中可以清楚地看到:


Firefox 45.0.0 (Windows 7 0.0.0): Executed 321 of 192 (skipped 7) SUCCESS (0 secs / 1 min 3.757 secs)
Chrome 51.0.2704 (Windows 7 0.0.0): Executed 399 of 192 (skipped 11) SUCCESS (0 secs / 1 min 2.239 secs)
PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 444 of 192 (skipped 11) SUCCESS (0 secs / 1 min 0.515 secs)

它永远持续下去。经过近一个小时的执行,结果如下:

Chrome 51.0.2704 (Windows 7 0.0.0): Executed 20171 of 192 (skipped 472) SUCCESS (0 secs / 50 mins 7.281 secs)
Firefox 45.0.0 (Windows 7 0.0.0): Executed 3186 of 192 (skipped 72) DISCONNECTED (14 mins 48.503 secs / 12 mins 16.547 secs)
PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 27054 of 192 (skipped 611) DISCONNECTED (48 mins 25.253 secs / 47 mins 34.776 secs)

不管测试是通过还是失败,或者它们为什么会失败( TypeError, ReferenceError... ),测试都会永远运行(所有测试都在这里通过,如您所见)。只有当我在命令行中停止 grunt 任务时,执行才会停止。

Karma 配置和 grunt 任务在过去几个月没有改变。 Singlerun 和 autowatch 设置(以及任何其他设置)是无关紧要的。

被测代码似乎无关紧要。一些更改,它们使问题消失了一段时间,但是当我编写新测试时,它总是会回来。当然,一开始我认为是我的代码是罪魁祸首,但下面将说明为什么这不是合乎逻辑的结论。

奇怪的行为总是在创建新测试时开始,但测试代码本身似乎无关紧要,因为新测试从不使用任何特殊操作或覆盖其他测试不使用的组件。此外,即使新测试是一个完全空的函数体,它仍然会导致奇怪的行为,这表明当被测试覆盖时,导致问题的并不是程序中的新决策路径。这就是为什么我不相信代码是罪魁祸首。
我还通过关闭随机测试(我们很久以前使用的没有任何问题)来停止无限执行,但是当我添加新测试时问题总是回来。

环境无关紧要。测试在我的 Windows 机器上和 Linux 服务器上的 CI 中无限运行。

我还认为可能是内存限制问题,因为有一段时间,浏览器在某个与新功能或新测试无关的测试中崩溃了(并且已经运行了几个月)。当我关闭该测试时,问题停止了一段时间,但后来又出现了(因为我一直在编写测试)。

我将所有 NPM 包和 Bower 组件更新到最新版本,但这并没有改变无限循环。

现在我完全没有想法了。有没有人遇到过这种奇怪的行为和控制台输出?

最佳答案

我们刚刚解决了这个确切的问题。问题是我们的应用程序中有一个注销功能,可以在 之前执行各种任务。将浏览器重定向到另一个页面 .我们围绕注销功能添加的其中一项测试不是模拟 window.redirect 调用,当它从 karma 测试运行中执行时,它会导致循环行为。

在模拟/监视此调用后,循环行为停止了。

不确定这是否与您遇到的问题相同,但希望这些信息对您有所帮助!

关于angularjs - Karma 单元测试在无限循环中一遍又一遍地运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37681711/

相关文章:

javascript - 使用 Angular JS,在路由更改时关闭 Web 套接字连接的正确方法是什么?

javascript - '错误 : Unexpected request' during Karma Angular Unit Test

java - Cucumber Runner 不会使用 Karate 加载所有功能文件

angular - karma 测试运行器在完成后不关闭

javascript - 如何使用javascript验证输入字段仅限制数字并将范围设置为最大值和最小值

javascript - 更改非事件页面标题

AngularJS : Transclude a single input element into a directive template without using a container

javascript - ng-repeat 内的 ng-repeat 创建空的 td 元素 - Angular

javascript - 在 jasmine 规范中使用 module.exports

angular - 为什么我的测试不使用服务 stub 方法?