Тестирование AngularJS-приложения при помощи Testacular (karma)
Table of Contents
Ниже опишу проблемы, которые возникли при настройке среды тестирования, и их решения.
TypeError: jasmine.getEnv().currentSpec is null
Ошибка состоит в том, что версия используемого в проекте AngularJS не совпадает с версией установленного через npm пакета karma.
Поэтому в конфиге нужно заменить значение переменной files:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
files = [ JASMINE, JASMINE_ADAPTER, '../app/lib/angular/angular.js', // ANGULAR_SCENARIO, // ANGULAR_SCENARIO_ADAPTER, '../app/lib/angular/angular-scenario.js', '../app/lib/angular/jstd-scenario-adapter.js', '../app/lib/angular/jstd-scenario-adapter-config.js', '../app/lib/angular/angular-mocks.js', '../app/lib/angular/angular-resource.js', '../app/lib/angular/angular-cookies.js', '../app/js/**/*.js', '**/*Spec.js' ]; |
Т.е. заменить ANGULAR_SCENARIO и ANGULAR_SCENARIO_ADAPTER на локальные. Чуть более подробно написал здесь — http://stackoverflow.com/questions/10970809/typeerror-jasmine-getenv-currentspec-is-null/16547190#16547190.
Но вообще-то, если подумать, лучший способ — обновить AngularJS.
Executed 0 of 0 SUCCESS, т.е. не выполняются тесты, сколько бы их ни было
Лечится все правильным порядком файлов опять же в files:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
files = [ '../app/lib/angular/angular.js', '../app/lib/angular/angular-resource.js', '../app/lib/angular/angular-cookies.js', '../app/lib/angular/i18n/angular-locale_ru-ru.js', '../app/lib/angular/angular-mocks.js', // ANGULAR_SCENARIO, // ANGULAR_SCENARIO_ADAPTER, '../app/lib/angular/angular-scenario.js', '../app/lib/angular/jstd-scenario-adapter.js', '../app/lib/angular/jstd-scenario-adapter-config.js', JASMINE, JASMINE_ADAPTER, // '../app/js/app.js', '../app/js/**/*.js', '**/*Spec.js' ]; |
Тут важно, чтобы jasmine грузился после angular. Вот обсуждение этого — https://github.com/karma-runner/karma/issues/66#issuecomment-9535599
Вторая возможная причина — для unit-тестов не надо грузить angular-scenario.js — http://stackoverflow.com/a/14988427/801426. Я могу сказать только, что от их отсутсутвия хуже не стало.
browser is not defined
В итоге все приходит к этой проблеме.
Она происходит от того, что человек не разобрался, что он хочет: e2e-тесты или unit-тесты.
Вот тест для примера, который также вызывает такую ошибку:
1 2 3 4 5 6 |
describe('Touch App:', function () { it('should redirect index.html to index.html#/top', function () { browser().navigateTo(urlTo()); expect(browser().location().url()).toBe('/top'); }); }); |
Дело в том, что e2e-тесты предназначены для грубого тестирования всего приложения (доступность страниц по ссылкам, проверке контента страниц по ссылкам).
Unit-тесты .. ну в общем это unit-тесты.
Так вот.
Jasmine нужно грузить только для unit-тестов, angular-scenario — только для e2e-тестов. Друг с другом они несовместимы, и поэтому нужно иметь два конфига: один для unit-тестов, другой — для e2e-тестов.
Вот примерный конфиг для e2e-тестов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
// end-to-end tests config // Karma configuration // Generated on Tue May 14 2013 16:32:16 GMT+0400 (MSK) // base path, that will be used to resolve files and exclude basePath = '../'; // list of files / patterns to load in the browser files = [ ANGULAR_SCENARIO, ANGULAR_SCENARIO_ADAPTER, './e2e/*Spec.js' ]; // list of files to exclude exclude = [ ]; // test results reporter to use // possible values: 'dots', 'progress', 'junit' reporters = ['progress']; // web server port port = 9876; // cli runner port runnerPort = 9100; // enable / disable colors in the output (reporters and logs) colors = true; // level of logging // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG logLevel = LOG_INFO; //logLevel = LOG_DEBUG; // enable / disable watching file and executing tests whenever any file changes autoWatch = true; // Start these browsers, currently available: // - Chrome // - ChromeCanary // - Firefox // - Opera // - Safari (only Mac) // - PhantomJS // - IE (only Windows) browsers = ['ChromeCanary']; // If browser does not capture in given timeout [ms], kill it captureTimeout = 60000; // Continuous Integration mode // if true, it capture browsers, run tests and exit singleRun = false; proxies = { '/': '<хост>', '/web': '<хост>/app/index.html#/' }; urlRoot = '/_karma_random_stuff_e2e_/'; |
Полезные ссылки
https://github.com/angular/angular-seed — приложение-пример для показа правильного тестирования от создателей AngularJS
http://docs.angularjs.org/guide/dev_guide.e2e-testing — описание API e2e-тестов
http://www.youtube.com/watch?v=MVw8N3hTfCI — видео про начало работы с Testacular
http://karma-runner.github.io/0.8/index.html — официальная документация.