Каковы рекомендуемые способы отладки приложений Worklight?

Я нахожу невероятно медленным исправление проблем, характерных для iOS-части моего приложения. Мне бы хотелось знать рекомендуемый способ отладки приложений Worklight, когда отладчик браузера недоступен.

В частности, я работаю над проблемами с WL.JSONStore, который работает только на iOS и Android. Я не могу использовать отладчик браузера, чтобы увидеть, что происходит. Когда я делаю операторы WL.Logger.debug(), в консоли Xcode ничего не отображается, а на консоли симулятора iPad (Cordova) отображаются только несколько строк. На этой неделе также были периоды, когда нигде не печатался вывод.

Я также скачал и установил Weinre, но ни одно из утверждений print не отображается в его консоли, и в целом я просто не вижу информации о нужных мне областях.

Заранее спасибо за ваши предложения.

2 ответа

Решение

Cnandreu дает отличные советы здесь. Тем не менее, видимость довольно плохая, и эти подходы не решили мою проблему. Я также хотел бы предложить то, что я нашел наиболее полезным в моем проекте (кроме WL.Logger.debug() везде):

  • JSConsole был незаменим ( http://jsconsole.com/). На самом деле, я не использую его так, как задумано. Однако я обнаружил, что это предупреждение о запуске запускает что-то с WL.Logger.debug() (и console.log()), что позволяет операторам фактически печатать на консоль, чтобы я мог видеть, что я делаю.

  • В iOS 6 Safari на Mac позволяет вам проверять DOM подключенного устройства. Это умеренно полезно, особенно для проблем гибридного пользовательского интерфейса, которые ведут себя не так, как обычно, при естественной работе на iOS. В противном случае я не нахожу это супер полезным. Подробнее см. На странице https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/DebuggingSafarioniPhoneContent/DebuggingSafarioniPhoneContent.html.

  • Единственный наиболее полезный метод, который я использовал, - это запись сообщений о состоянии в пользовательский интерфейс. Да, это уродливый доисторический способ сделать что-то, но все остальное - включая операторы печати ошибок 80-х годов на консоль - с треском провалились. Вот что я делаю (используя Dojo и JavaScript):

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

куда audio_status это ID DIV, который отображает содержимое отладки.

Это ужасно, но, по крайней мере, мы можем что-то увидеть.

General Worklight 5.0.6 Отладка

Советы по отладке для JSONStore в Worklight 5.0.6

  • Пытаться console.log('message') или же WL.Logger.debug('message') внутри jsonstore.js и ваш код ([app-name].js, так далее.). Вывод должен отображаться в консоли Xcode и LogCat Android.
  • Сброс симулятора или эмулятора и / или вызов WL.JSONStore.destroy(),
  • Убедитесь, что вы работаете в поддерживаемой среде:
    • Android> = 2.2 ARM / x86 Emulator или Устройства
    • iOS >=5.0 Симулятор или Устройство
  • Попробуйте отключить шифрование (т.е. не передавайте пароль WL.JSONStore.init или же WL.JSONStore.initCollection).
  • Посмотрите на файл базы данных SQLite, созданный JSONStore. Это работает только если шифрование выключено.

    • Android:

      $ 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 и выбор данных с SELECT * FROM [collection-name];, Выходить sqlite3 тип .exit, Взгляните на этот вопрос Stackru для примера.

  • (Только для Android) Включите подробный JSONStore.

    adb shell setprop log.tag.jsonstore-core VERBOSE
    adb shell getprop log.tag.jsonstore-core
    
  • (iOS> = 6.0 и только Safari >=6.0) Попробуйте использовать отладчик JavaScript. Установить точки останова внутри jsonstore.js, Полезные строки:

    • Мост к нативному коду:

      cdv.exec(options.onSuccess, options.onFailure, pluginName, nativeFunction, args);
      
    • Успешные обратные вызовы, возвращающиеся из собственного кода:

      deferred.resolve(data, more);
      
    • Отказ колбэков, возвращающихся из собственного кода:

      deferred.reject(new ErrorObject(errorObject));
      
  • Напишите правильные тесты (единичные, функциональные, интеграционные - получите тестовое покрытие). Вот шаблон, который использует QUnit и Sinon.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>
    

Ожидаемый вывод кода выше:

образ

Примечание: вот общая статья о рабочем процессе PhoneGap/Cordova для конкретного разработчика. Есть часть отладки, только на основе браузера. Частично это относится и к разработке IBM Worklight.

Другие вопросы по тегам