如何调试在 phantomjs 中运行的 ember-cli 测试

Posted

技术标签:

【中文标题】如何调试在 phantomjs 中运行的 ember-cli 测试【英文标题】:How to debug ember-cli tests running in phantomjs 【发布时间】:2015-03-21 15:13:20 【问题描述】:

上下文:我对我的 ember-cli 应用程序进行了验收测试,并且测试在 Chrome 中顺利通过。但是,在 phantomjs 中,我的测试失败了—— UI 的创建方式不同,我正在尝试找出原因。 (我认为测试是因为https://github.com/ember-cli/ember-cli/issues/1763 而被破坏,但如何调试的一般问题仍然存在)

在 Chrome 中,我可以在测试中使用标准调试工具,一切都很好——但在 phantomjs 中,我无法使用调试器进行调试。我也没有在输出中看到 console.log() 消息——我得到的只是终端窗口中的测试结果列表。

我可以通过编写类似的东西来获取诊断信息

equal(true, false, "This is a log message");

然后我收到消息作为失败断言的详细信息,或者我可以尝试找出 DOM 中的内容

equal(true, false, document.getElementsByClassName("my-class".innerhtml);

但是这两个a:停止测试,b:只让我记录测试本身的信息,而不是我的应用程序。

有没有办法在“ember 测试”之外运行我的测试,或者有什么方法可以附加到正在运行的测试进程?或者,有没有办法让 console.log() 消息显示在输出中?

【问题讨论】:

【参考方案1】:

您可以公开 PhantomJS 调试端口并在浏览器中打开它,然后您可以在调试器断点处与上下文交互。

Debugging tests on PhantomJS using Testem test runner

【讨论】:

当我尝试这样做时,我可以附加到 phantomjs 进程,但随后发生了一些奇怪的事情,看起来好像 ember 正在跳入并试图捕获妨碍调试器的异常。也就是说,它确实提醒我应该使用“ember test --server”,从那里我可以在 testem 窗口中显示所有控制台日志,这是朝着正确方向迈出的一大步。谢谢!【参考方案2】:

如果我使用 TAP 报告器,要回答我最初的问题中关于“如何显示日志消息”的部分,那么 console.log(在我的应用程序和我的测试中)消息会显示在输出中; xunit 记者没有通过 console.log 登录,这让我很困惑。

(我还遇到了在 teamcity 上运行测试的行为与在本地运行不同的问题;在这种情况下,将 TAP 报告器与 https://github.com/aghassemi/tap-xunit(或 TAP teamcity 插件)结合使用可以让我获取日志消息和测试计数)

【讨论】:

【参考方案3】:

testem.json 中添加"phantomjs_debug_port": 9000

运行测试时,在浏览器中访问http://localhost:9000,然后点击显示的长链接。

来源:cssugared

【讨论】:

如果您遇到任何问题,请确保您机器上的其他设备没有将端口 9000 用于其他设备 警告任何在 2017 年阅读此内容的人。暴露在端口 9000 上的检查器非常不稳定,无法用于其预期目的。尝试了不同的端口,但没有任何区别。【参考方案4】:

其他答案我没有运气,所以这是我发现的:

在您希望能够与浏览器中的容器交互的测试点添加return pauseTest();。这是在文档中,但我不确定它在指南中。

【讨论】:

我在代码中(在 cmets 中)找到了它的“记录”。谢谢。 我收到pauseTest 未定义或不是函数的错误。我想我必须从某个地方import 它,但不确定如何。 Ember.Test.pauseTest Ember pauseTest() API

以上是关于如何调试在 phantomjs 中运行的 ember-cli 测试的主要内容,如果未能解决你的问题,请参考以下文章

调试 PhantomJS 网页.打开失败

使用 PhantomJS 嵌入网页的所有图像会产生警告但有效

在 Cucumber + Capybara + PhantomJS 在 Rails 中调试 jQuery Ajax

phantomjs:如何在phantomjs中使用npm模块?

如何使用 NodeJS 在 AWS Lambda 上运行 PhantomJS

如何获取嵌入在 PhantomJS 运行的 JS 的 HTML 页面结果中的 JSON 对象并将它们传递给 java 代码?