调试Worklight应用程序的推荐方法有哪些?

时间:2013-04-11 22:04:45

标签: debugging ibm-mobilefirst jsonstore

我发现修复特定于我的应用的iOS部分的问题非常慢。当浏览器调试器不可用时,我想知道调试Worklight应用程序的推荐方法。

特别是,我正在研究WL.JSONStore的问题,它只适用于iOS和Android。我无法使用浏览器调试器来查看正在发生的事情。当我执行WL.Logger.debug()语句时,Xcode控制台中没有任何内容,iPad模拟器控制台(Cordova)只显示几行。本周还有一些时期在任何地方都没有打印输出。

我也下载并安装了Weinre,但是没有一个打印语句出现在它的控制台中,一般来说我只是看不到有关我需要的区域的信息。

提前感谢您的建议。

2 个答案:

答案 0 :(得分:4)

General Worklight 5.0.6调试

Worklight 5.0.6上的JSONStore调试技巧

  • console.log('message')内尝试WL.Logger.debug('message')jsonstore.js以及您的代码([app-name].js等)。输出应显示在Xcode的控制台和Android的LogCat中。
  • 重置模拟器或模拟器和/或致电WL.JSONStore.destroy()
  • 确保您在受支持的环境中运行:
    • Android> = 2.2 ARM / x86仿真器或设备
    • iOS> = 5.0模拟器或设备
  • 尝试关闭加密功能(即不要将密码传递给WL.JSONStore.initWL.JSONStore.initCollection)。
  • 查看JSONStore生成的SQLite数据库文件。这仅在加密关闭时有效。

    • 机器人:

      $ adb shell
      $ cd /data/data/com.[app-name]/databases/wljsonstore
      $ sqlite3 jsonstore.sqlite
      
    • 的iOS

      $ cd ~/Library/Application Support/iPhone Simulator/6.1/Applications/[id]/Documents/wljsonstore
      $ sqlite3 jsonstore.sqlite
      

    尝试使用.schema查看searchField并选择SELECT * FROM [collection-name];的数据。要退出sqlite3,请键入.exit。请查看this StackOverflow question示例。

  • (仅限Android)启用详细的JSONStore。

    adb shell setprop log.tag.jsonstore-core VERBOSE
    adb shell getprop log.tag.jsonstore-core
    
  • (iOS> = 6.0且Safari> =仅限6.0)尝试使用JavaScript debugger。在jsonstore.js内设置断点。有用的路线:

    • 桥接到本机代码:

      cdv.exec(options.onSuccess, options.onFailure, pluginName, nativeFunction, args);
      
    • 从本机代码返回的成功回调:

      deferred.resolve(data, more);
      
    • 从本机代码返回的失败回调:

      deferred.reject(new ErrorObject(errorObject));
      
  • 编写正确的测试(单元,功能,集成 - 获得测试覆盖率)。这是一个使用QUnitSinon.js创建Sandbox环境的模板,您可以在其中测试JSONStore如何处理不同类型的数据/调用:

    <!DOCTYPE HTML>
    <html>
    
    <head>
        <title>JSONStore Test App</title>
        <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.11.0.css">
        <script src="http://code.jquery.com/qunit/qunit-1.11.0.js"></script>
        <script src="http://sinonjs.org/releases/sinon-1.6.0.js"></script>
        <script>
            //QUnit configuration flags, no need to change it.
            QUnit.config.requireExpects = true;
        </script>
    </head>
    
    <body id="content" style="display: none;">
    
        <!-- Test results will be appended to the div below, no need to make changes here. -->
        <div id="qunit"></div>
    
    <script>
    
    //Start Worklight
    WL.Client.init({connectOnStartup : false});
    
    //Hook into the deviceready event
    document.addEventListener("deviceready", onDeviceReady, false);
    
    //onDeviceReady will be called when JSONStore/Cordova is ready
    function onDeviceReady () {
    
        //Auto executing function that holds the test
        (function (jQuery) { //The variable jQuery is usable inside.
    
            //Mock WL.Client.invokeProcedure using a Stub.
            //This is only useful if you need to link a Worklight Adapter
            //to a JSONStore collection to reproduce your issue or bug.
            //API Doc: http://sinonjs.org/docs/#stubs
            var fakeAdapter = sinon.stub(WL.Client, "invokeProcedure", function (invocationData, options) {
    
                //DO NOT Create a real adapter, just mock the reponse here if it's relevant to the bug.
                var ADAPTER_RESPONSE = {invocationResult: {fakeKey: [{fn: 'carlos'}, {fn: 'mike'}]}};
                options.onSuccess(ADAPTER_RESPONSE);
            });
    
            //[**Explain your test here**]
            var EXPECTED_ASSERTIONS = 2; //every assertion is a deepEqual below.
            asyncTest('[**Meaningful title here**]', EXPECTED_ASSERTIONS, function () {
    
                //Destroy first to make sure we don't depend on state
                WL.JSONStore.destroy()
    
                .then(function () {
    
                    //[**Start writting your test here**]
                    //The test below is an example, it does the following:
                    // - Initializes a collection linked to a fake adapter (see stub above).
                    // - Checks if initialization worked by checking the collection name.
                    // - Loads data from the fake adapter (see stub above).
                    // - Checks if load worked by checking the number of documents loaded.
    
                    var collections = {
                        col1 : {
                            searchFields : {fn: 'string'},
                            adapter : {name: 'fakeAdapter',
                                load: {
                                    procedure: 'fakeProcedure',
                                    params: [],
                                    key: 'fakeKey'
                                }
                            }
                        }
                    };
    
                    return WL.JSONStore.init(collections);
                })
    
                .then(function (response) {
    
                    //Prep for your assertion
                    var ACTUAL_VALUE = response.col1.name;
                    var EXPECTED_VALUE = 'col1';
                    var COMMENT = 'Checking for the right collection name';
    
                    //Do your assertion using deepEqual
                    //API Doc: http://api.qunitjs.com/deepEqual/
                    deepEqual(ACTUAL_VALUE, EXPECTED_VALUE, COMMENT);
    
                    return WL.JSONStore.get('col1').load();
                })
    
                .then(function (response) {
    
                    //Prep for your assertion
                    var ACTUAL_VALUE = response; //load returns number of documents loaded
                    var EXPECTED_VALUE = 2; //two documents are returned by the fake adapter (stub)
                    var COMMENT = 'Checking if load worked';
    
                    //Do the assertion using deepEqual
                    deepEqual(ACTUAL_VALUE, EXPECTED_VALUE, COMMENT);
    
                    start();//call start() after you finish your test succesfully
                })
    
                .fail(function (error) {
    
                    deepEqual(false, true, 'Failure callback should not be called' + error.toString());
                    start();//call start() after you finish your test with a failure
                });
    
            });
    
        }(WLJQ)); //end auto executing function that holds the test
    
    } //end wlCommonInit
    </script>
    
    </body>
    </html>
    

上述代码的预期输出:

image

旁注:这是关于特定开发人员的PhoneGap / Cordova工作流程的general article。有一部分调试,只是基于浏览器。其中一些也适用于IBM Worklight开发。

答案 1 :(得分:1)

cnandreu在这里提供了很好的建议。可见性仍然很差,这些方法并没有真正解决我的问题。我还想建议我发现在我的项目中最有用的东西(除了WL.Logger.debug()无处不在):

  • JSConsole一直是必不可少的(http://jsconsole.com/)。实际上,我实际上并没有像预期的那样使用它。但是,我发现它的启动警告消息与WL.Logger.debug()(以及console.log())有关,它使语句能够实际打印到控制台,这样我才能看到我在做什么。 / p>

  • 在iOS 6中,Mac上的Safari可让您检查连接设备的DOM。它非常有用,特别是对于在iOS上本机运行时只会出现行为异常的混合UI问题。我不觉得它非常有用。详情请见https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/DebuggingSafarioniPhoneContent/DebuggingSafarioniPhoneContent.html

  • 我一直使用的最有用的技术是将状态消息写入UI。是的,这是一种丑陋的史前方式,但其他一切 - 包括80年代错误打印到控制台的声明 - 都失败了。这就是我所做的(使用Dojo和JavaScript):

    var v = dom.byId('audio_status'); if (v) { v.innerHTML += "recording file ["+filename+"]"; }

其中audio_status是显示调试内容的DIV的ID

这个东西很难看,但至少我们可以看到的东西