【问题标题】:PhantomJS exits after syntax error when running unit tests运行单元测试时出现语法错误后 PhantomJS 退出
【发布时间】: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 在我的情况下,标志是否是单一的并不重要

标签: javascript unit-testing jasmine phantomjs karma-runner


【解决方案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 仍然不起作用。如果你得到一半的积分对你有好处。感谢您的尝试。
猜你喜欢
  • 2017-07-21
  • 1970-01-01
  • 2013-01-01
  • 2018-07-18
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
相关资源
最近更新 更多