Тестирование AngularJS-приложения при помощи Testacular (karma)

  • 05, 15, 2013
  •  
  •  Angular.js, Testing
  • Комментарии к записи Тестирование AngularJS-приложения при помощи Testacular (karma) отключены

Ниже опишу проблемы, которые возникли при настройке среды тестирования, и их решения.

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.jshttp://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 — официальная документация.

d6c7a771bfa6c2dca72ebe5927e6a6f48a8a4511c5

d6c7a771bfcb1003aff8e16db0c0305c89821dc7a1

Comments are closed.