运行单元测试时出现语法错误后 PhantomJS 退出

Posted

技术标签:

【中文标题】运行单元测试时出现语法错误后 PhantomJS 退出【英文标题】:PhantomJS exits after syntax error when running unit tests 【发布时间】:2014-11-09 21:42:34 【问题描述】:

我们正在构建服务器上使用 Karma 和 PhantomJS 的组合运行我们的 Jasmine 单元测试。在 Chrome 上本地运行测试工作正常,错误不会在那里发生(这是一个不同的问题)。以下是正在发生的事情:

在执行的某一时刻,测试遇到“未定义”错误并直接停止:

PhantomJS 1.9.7 (Mac OS X) ERROR
  TypeError: 'undefined' is not an object (evaluating 'dropScope.resize')
  at /Users/nwinkler/workspaces/.../foo.js:250
PhantomJS 1.9.7 (Mac OS X): Executed 654 of 1221 ERROR (14.512 secs / 14.386 secs)
DEBUG [karma]: Run complete, exitting.
DEBUG [launcher]: Disconnecting all browsers

即使使用 --force 标志运行 karma,它仍然会在此时退出。

有没有办法让 Karma/PhantomJS 继续运行测试而不在此时停止?为什么 PhantomJS 不能从这个错误中恢复?

我不是在寻找 undefined 错误的解决方案,这是一个不同的主题 - 我只是想了解为什么 PhantomJS 和 Karma 在此时退出并且不继续进行剩余的单元测试。

【问题讨论】:

也在等待这个问题的答案... 无论浏览器如何,我的套件都会发生这种情况。我正在尝试测试 CKEditor,在我们的测试中,我们创建了确实会导致 js 错误的虚拟编辑器,但是当您尝试断言某种 dom 更改时,js 错误会导致 Karma 停止测试执行。 更新:当我们的套件超过 800 到 1000 多个测试时,这些错误似乎会堆积起来并导致关闭。我发现更改 files 数组中的加载顺序会有所帮助,但它会阻止我们使用 glob 来包含测试。 Karma 应该只在断言而不是错误时失败。 你使用 --single-run 标志吗? @Boris 在我的情况下,标志是否是单一的并不重要 【参考方案1】:

我通常使用此代码来警告错误并恢复运行(phantomjs)

phantom.onError = function(msg, trace) 
  var msgStack = ['PHANTOM ERROR: ' + msg];
  if (trace && trace.length) 
    msgStack.push('TRACE:');
    trace.forEach(function(t) 
      msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function +')' : ''));
    );
  
  console.error(msgStack.join('\n'));
  //phantom.exit(1); // do not stop
;

如果您使用的是页面对象:

page.onError = function(msg, trace) 
  // never display errors
   var msgStack = ['SITE ERROR: ' + msg];
  if (trace && trace.length) 
    msgStack.push('TRACE:');
    trace.forEach(function(t) 
      msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function +')' : ''));
    );
  
  console.error(msgStack.join('\n'));

【讨论】:

您将此代码放在配置中的什么位置?在 Karma 配置文件中,还是在您包含在测试中的自定义代码文件中? 我把这段代码放在代码文件中第一个测试的正上方。 @Eun 此代码对我没有影响。我尝试将它添加到我的第一个测试的顶部,也在幻像启动器代码中。没有效果。你能更具体地说明这需要去哪里吗?你用什么版本的幻影来为你工作?我在 phantomjs.js 中找不到应该覆盖的 onError 函数。 @branchgabriel 我正在使用 phantomjs 1.9.8。我直接使用 phantomjs 之前没有被另一个应用程序调用。 onError 是在 1.5 (phantomjs.org/api/phantom/handler/on-error.html) 中首次引入的(page.onError 部分当然是如果您的变量名为 page @Eun 仍然不起作用。如果你得到一半的积分对你有好处。感谢您的尝试。

以上是关于运行单元测试时出现语法错误后 PhantomJS 退出的主要内容,如果未能解决你的问题,请参考以下文章

当我在 ubundu12.04 中运行“phantomjs”命令时出现分段错误(核心转储)

运行测试单元时出现 VUE 错误

ReferenceError:未定义窗口。当我通过 jest 运行 npm test 进行单元测试时出现此错误

获取错误:在角度 js 中进行单元测试时出现 $injector:modulerr 模块错误

在 ubuntu 上运行 newman 时出现语法错误

使用 Roboelectric 3.8 运行单元测试时出现 NoClassDefFoundError