Тестирование AngularJS-приложения при помощи Testacular (karma)
Table of Contents
Ниже опишу проблемы, которые возникли при настройке среды тестирования, и их решения.
TypeError: jasmine.getEnv().currentSpec is null
Ошибка состоит в том, что версия используемого в проекте AngularJS не совпадает с версией установленного через npm пакета karma.
Поэтому в конфиге нужно заменить значение переменной files:
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:
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-тесты.
Вот тест для примера, который также вызывает такую ошибку:
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-тестов:
// 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 — официальная документация.

