Как протестировать приложение AngularJS/SocketStream/Node.js с помощью Karma

Я работаю над приложением AngularJS, которое доставляется сервером SocketStream/node.js. У меня есть служба AngularJS, которая вызывает функции API на сервере SocketStream, и до сих пор прогресс был хорошим.

Но теперь пришло время начать писать первые тесты, и первая среда тестирования, которая пришла на ум, — это Karma/Jasmine, так как это рекомендуемая настройка AngularJS.

Пока все хорошо, но поскольку мои модули AngularJS импортируются с использованием «require» (версия SocketStream, не require.js), а вызовы API сервера являются частью теста, мне нужно настроить Karma для загрузки SocketStream (по крайней мере, его клиентская сторона).

Я внимательно изучил 'https://github.com/yiwang/angular-phonecat-livescript-socketstream', но когда я запускаю этот пример, я получаю ошибки времени выполнения, возможно, потому, что у меня установлены более поздние версии различных зависимостей.

Мне удалось разрешить «требуется», упаковав мое приложение SocketStream, добавив «ss.client.packAssets()» в app.js и запустив «SS_PACK=1 node app.js», но когда я запускаю карму, он регистрирует сообщение об ошибке. говоря:

'Chrome 23.0 (Linux) ERROR
    Uncaught TypeError: undefined is not a function
    at /the...path/client/static/assets/app/1368026081351.js:25'

«1368026081351.js» — это упакованный файл активов SocketStream. Если я не загружу его, сообщение об ошибке будет выглядеть примерно так: «require is undefined», поэтому я думаю, что ошибка происходит где-то внутри требуемого кода SocketStream. Также потому, что я запускаю карму в режиме DEBUG и вижу все обслуживаемые файлы.

Я пробовал разные подходы, чтобы узнать, что происходит, но теперь это не помогло. Итак, мои вопросы:

Кто-нибудь еще успешно тестирует AngularJS/SocketStream с помощью Karma? У кого-нибудь есть какие-либо предложения относительно того, как я могу исправить или хотя бы отладить эту проблему? Есть ли альтернативы/лучшие решения?


person Gert    schedule 08.05.2013    source источник


Ответы (1)


Пришло время ответить на мой собственный вопрос:

Вроде как, потому что я пришел к выводу, что Karma и node.js/SocketStream во многом пересекаются, поэтому я решил посмотреть, смогу ли я вообще отказаться от Karma и предоставить тестовую платформу Jasmine через SocketStream. Оказывается, это возможно, и вот как я это сделал:

Я определил новый маршрут и клиент SocketStream в файле app.js:

ss.client.define( 'test', {
    view: 'SpecRunner.html',
    css:  ['libs/test'],
    code: ['libs', 'tests', 'app'],
    tmpl: 'none'
});

ss.http.route( '/test', function(req, res) {
    res.serveClient( 'test' );
});

Я скачал jasmine-standalone-1.3.1.zip и скопировал «SpecRunner.html» в папку «client/views». Затем я отредактировал его, чтобы он загружал AngularJS и все клиентские файлы SocketStream, как и все другие представления:

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular-resource.min.js"></script>
<SocketStream/>

Я удалил теги «скрипт», которые импортируют исходные файлы образцов («Player.js» и «Song.js») и спецификации, но оставил последний блок «скрипт» без изменений.

Затем я создал новую папку внутри «client/css/libs» под названием «test» и скопировал туда «jasmine.css» без изменений.

Затем я скопировал «jasmine.js» и «jasmine-html.js», переименовав их в «01-jasmine.js» и «02-jasmine-html.js», но без изменений, в «/client/code/libs».

Теперь Jasmine на месте и будет вызываться с использованием маршрута '/test'. Немного неудовлетворительно то, что я не нашел элегантного места для хранения файлов спецификаций. Пока они работают только в том случае, если я помещу их в папку «libs». В любом другом месте они обслуживаются SocketStream как модули и не запускаются.

Но я могу жить с этим пока. Я могу запускать тесты Jasmine без специальной настройки Karma.

person Gert    schedule 10.05.2013