【问题标题】:How to get QUnit to print backtrace on exception?如何让 QUnit 在异常时打印回溯?
【发布时间】:2012-04-01 20:35:34
【问题描述】:

当我的 QUnit 测试中发生异常时,它只会说

Died on test #n: message

如何让它打印回溯或其他一些位置信息,以便我可以看到异常发生的位置?

【问题讨论】:

  • 最新的 QUnit 将输出它捕获的异常的源代码行,即使在 Safari 中也是如此,否则在生成堆栈跟踪方面非常糟糕。

标签: javascript unit-testing qunit


【解决方案1】:

我认为不可能让 QUnit 为您提供错误发生位置的踪迹。您的代码生成了一个异常,QUnit 已捕获并报告了该异常。如果您勾选 QUnit 结果顶部的“notrycatch”复选框,您的测试将再次运行,但这次 QUnit 不会捕获异常。然后,您的浏览器可能会为您提供有关实际发生情况的更多信息,但这取决于错误是什么。

【讨论】:

  • 我没有在浏览器中运行 QUnit,也找不到以编程方式设置选项的文档。你知道怎么做吗?
  • 不确定这在您不使用浏览器时是否有用,但在 URL 中添加“?notrycatch=true”与勾选复选框相同。
  • 我会接受这个答案,因为它最接近。我想出了如何以编程方式做到这一点:qunit.config.notrycatch = true;
【解决方案2】:

编辑: 在回答这个问题时,我产生了一个不是你想问的怀疑。所以我编辑了答案来展示这个,可能更有用的部分,首先:

因为您写的是“当我的 QUnit 测试中发生异常时”,所以让我更深入地解释一下测试的概念:

首先:异常不会出现在您的 QUnit 测试中,而是出现在您的代码中。 好消息是:在您的情况下,qUnit 正在做它应该做的事情:它测试您的代码,并且由于您的代码有问题,因此您的代码在测试时会引发异常。

由于 qUnit 是一个测试环境,它不负责提供异常回溯。它只是用来检查您实现的功能是否按照您期望的方式工作,而不是跟踪错误。对于这样的目的,像 FireBug 或 Safari 的开发者工具这样的工具更合适。

让我描述一个场景:

  1. 你写了一个函数
  2. 您可以使用(即)FireBug 消除其中的错误
  3. 你写了一个 qUnit 测试用例来证明这个函数确实做了什么 你想要它做 - 测试通过
  4. (现在变得有趣了,因为这才是真正的测试 for) 你为你的函数添加了一些额外的功能,因为 需要的
  5. 如果你做的一切都正确,你的测试就通过了,你可以 确保一切都将继续按预期工作,因为它们确实如此 (如果你写得好)

总结一下:测试不是为了调试,而是为了确保事情按照你认为的方式工作。如果出现错误,你不会编写测试来解决它,而是你写一个测试来重现它。然后你找到错误,删除它,测试就会通过。如果稍后重新发明错误(即由于代码更改),测试将再次失败,您立即知道错误又回来了。

这可以通过建立测试驱动开发来更进一步,您在编写功能本身之前编写测试。那么上面的场景会变成这样:

  1. 您编写了一个测试,描述了您的代码的预期结果
  2. 您编写代码,当出现错误时,您可以使用 (ie.) 萤火虫
  3. 在进行过程中,一个接一个的测试将开始通过
  4. 添加附加功能时,首先编写附加 测试

这样做有两个主要优点:

  1. 您可以确保您已完成必要的测试,并且
  2. 您必须准确确定您希望代码执行的操作, 因为否则你无法编写测试。

测试愉快。

edit end - 原始答案如下,以防万一。

当使用 QUnit 时,我强烈建议遵循 jQuery 文档站点 http://docs.jquery.com/Qunit 上显示的方法:

要使用 QUnit,你必须包含它的 qunit.js 和 qunit.css 文件,并且 提供用于显示测试结果的基本 HTML 结构:

你所要做的就是加载 qunit.js 和 qunit.css 文件,然后把这个 sn-p 放到你的页面上,以获得关于测试过程的视觉反馈:

<h1 id="qunit-header">QUnit example</h1>
<h2 id="qunit-banner"></h2>
<div id="qunit-testrunner-toolbar"></div>
<h2 id="qunit-userAgent"></h2>
<ol id="qunit-tests"></ol>
<div id="qunit-fixture">test markup, will be hidden</div>

这样做会生成一个整齐呈现的交互式控制台,显示有关测试结果的准确报告。每个测试都有一行显示它是否通过,单击该行会展开每个测试的结果。这看起来有点像这样:

要自定义 qUnit 显示的错误消息,您只需将要显示的字符串附加到您的测试中。所以不是

ok($('.testitem:first').is(':data(droppable)'))

使用

ok($('.testitem:first').is(':data(droppable)'),
    "testitem is droppable after calling setup_items('.testitem')");

获取图片中显示的错误消息。否则 qUnit 会退回到与所用测试相关的一些标准错误消息。

【讨论】:

  • 这一切都很好,但大多无关紧要。他的问题可以用 qunit.config.notrycatch = true; 来回答
  • 很有趣 - 不得不像这样切换“模式” - 让我陷入困境,我敢肯定还有很多其他人。想知道有没有办法让 qunit 为调试过程提供更好的支持...
猜你喜欢
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2012-12-23
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
相关资源
最近更新 更多