gpt4 book ai didi

javascript - 为什么框架内的异常在 qUnit 中得不到通知?

转载 作者:数据小太阳 更新时间:2023-10-29 05:29:59 24 4
gpt4 key购买 nike

我注意到当测试的后面部分发生异常时,qUnit 不会发出任何通知。例如,在 test() 中运行它:

stop();
function myfun(ed) {
console.log('resumed');
start(); //Resume qunit
ok(1,'entered qunit again');
ok(ed.getContent()== 'expected content') // < causes exception, no getContent() yet.
}
R.tinymce.onAddEditor.add(myfun)

在页面的内部iframe中会引发异常(TypeError: ed.getContent is not a function),但 Qunit 状态区域中没有任何内容说明这一点。我看到 0 个失败。

(R 是内部 iframe,此处使用技术:http://www.mattevanoff.com/2011/01/unit-testing-jquery-w-qunit/)如果我假设这不是测试导致某些结果的 UI 交互序列的最佳方法,我是否正确?使用像 selenium 这样的东西总是更好,即使对于一些主要面向 javascript 的前端网络应用程序测试也是如此?

作为旁注,Firefox 控制台会在此处的异常下方显示 console.log,即使它先发生了......为什么?

最佳答案

如果您查看 qUnit 源代码,会发现有两种处理异常的机制。一个由 config.notrycatch 设置控制,并将测试设置、执行和拆卸包装在 try..catch block 中。这种方法对异步测试抛出的异常没有多大帮助,但是,qUnit 不是那里的调用者。这就是为什么有一个额外的 window.onerror 处理程序由 Test.ignoreGlobalErrors 设置控制。默认情况下,这两个设置都是 false,因此两种异常都会被捕获。事实上,以下代码(与您的代码基本相同,但没有特定于 TinyMCE 的部分)产生了我预期的结果:

test("foo", function()
{
stop();
function myfun(ed)
{
start();
ok(1, 'entered qunit again');
throw "bar";
}
setTimeout(myfun, 1000);
});

我首先看到一个通过的测试,消息为“再次输入 qunit”,然后是一个失败的测试,消息为:“未捕获的异常:bar”。至于为什么这对你不起作用,我可以看到以下选项:

  1. 您的 qUnit 副本已超过两年,早于 qUnit issue 134已修复并添加了全局异常处理程序。
  2. 您的代码正在更改 Test.ignoreGlobalErrors 设置(不太可能)。
  3. 存在一个返回true 的现有window.onerror 处理程序,从而告诉qUnit 错误已被处理。我检查了 TinyMCE 是否默认添加了一个,但它看起来不像。
  4. TinyMCE 在调用事件处理程序时捕获它们中的错误。这是处理多个回调时要做的合乎逻辑的事情,通常的方法是这样的:
for (var i = 0; i < callbacks.length; i++)
{
try
{
callbacks[i]();
}
catch (e)
{
console.error(e);
}
}

通过将所有异常重定向到 console.error,这可以确保仍然报告异常,同时调用所有回调,即使其中一个抛出异常。但是,由于异常已被处理,jQuery 无法再捕获它。我再次检查了 TinyMCE 是否实现了这种模式——它看起来不像。

更新:原来还有第五个选项是我没有想到的:异常是在框架内触发的,而 qUnit 没有在那里设置它的全局错误处理程序(已经因为跟踪框架创建非常重要,可以随时创建新框架)。通过将以下代码添加到框架中应该可以轻松解决此问题:

window.onerror = function()
{
if (parent.onerror)
{
// Forward the call to the parent frame
return parent.onerror.apply(parent, arguments);
}
else
return false;
}

关于您的旁注:console 对象不保证消息出现的任何特定顺序。事实上,代码 console.log("foo");throw "bar"; 也是先显示异常,再显示日志消息。这表明日志消息排队和处理延迟,可能是出于性能原因。但是您需要查看 Firefox 中 console 对象的实现才能确定 - 这是一个实现细节。

关于javascript - 为什么框架内的异常在 qUnit 中得不到通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20672403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com