Каковы рекомендуемые способы отладки приложений 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 Отладка
- Посмотрите на учебный модуль " Отладка ваших приложений". ( Прямая ссылка PDF)
Советы по отладке для 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.