在iOS的UIAutomation UIATarget.onAlert中处理自定义javascript异常

时间:2013-04-29 22:52:14

标签: javascript ios scope integration-testing ios-ui-automation

我已经设置了一些最终将成为jenkins测试的UIAutomation脚本。 UIAutomation脚本不以jenkins友好格式输出,因此我使用tuneup_js,特别是此failure exception

当测试失败时,我可以抛出自定义FailureException。正常捕获异常并正确记录失败输出。输出为Error: FailureException: "hello world"

当我尝试在FailureException处理程序onAlert内抛出相同的UIATarget.onAlert = function onAlert(alert) {...}时,会出现问题。在我的onAlert函数中,如果标题与某个正则表达式匹配,则抛出FailureException,但FailureException永远不会被捕获,并且测试会因以下输出而崩溃:

Script threw an uncaught JavaScript error: hello world on line 18 of assertions.js

我有什么想法可以将FailureException放在onAlert处理程序中并正确处理它?似乎onAlert的处理范围与其他测试不同,但我不确定如何纠正。

1 个答案:

答案 0 :(得分:3)

这里的核心问题是js异常并不真正适用于异步代码,例如事件循环(这就是为什么你很少在“现代javascript”代码中看到抛出的异常而人们使用错误回调代替)。

如果查看tuneup_js中的test函数,它会捕获fail引发的异常,然后调用UIALogger.logFailUIATarget.onAlert将响应某个顶级警报事件并在测试函数之外的上下文中运行,因此触发异常意味着它不会被test中的try / catch块捕获

有效的一件事是使用闭包将数据返回给调用者,如:

test("My UI Test", function(app, target) {
    var failureName = null;
    setupOnAlert(function(name) {
        failureName = name;
    });
    // do something that might trigger a UIAlert
    if (failureName) {
        fail(failureName);
    }
});

function setupOnAlert(fail_callback) {
UITarget.onAlert = function(alert) {
    // do something that may fail, if it fails:
    fail_callback("Some kind of error");
}
}

希望有所帮助!