Karma — это тестовый раннер для JavaScript, позволяющий запускать тесты в реальных браузерах и интегрироваться с различными фреймворками, такими как Jasmine, Mocha, QUnit. Одной из мощных возможностей Karma является расширяемость через декораторы, которые позволяют модифицировать поведение тестового окружения и конфигурации без изменения исходного кода тестов.
Декоратор в Karma — это функция, которая принимает исходный объект конфигурации или сервис и возвращает новый объект с модифицированным поведением. Декораторы широко применяются для:
Внутренне Karma использует систему внедрения зависимостей, похожую на
AngularJS. Декораторы применяются к сервисам Karma, таким как
logger, reporter, launcher,
config.
Для создания декоратора используется метод
karmaServer.decorate, либо через конфигурационный файл
karma.conf.js с функцией module.exports. Общая
структура:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: ['src/**/*.js', 'test/**/*.spec.js'],
reporters: ['progress'],
browsers: ['Chrome'],
plugins: [
'karma-jasmine',
'karma-chrome-launcher',
{'middleware:customLogger': ['factory', customLoggerDecorator]}
]
});
function customLoggerDecorator(logger) {
// Перехват метода info
const originalInfo = logger.info;
logger.info = function() {
console.log('Custom info:', arguments);
originalInfo.apply(logger, arguments);
};
return logger;
}
};
Ключевые моменты:
apply, call).Декораторы позволяют динамически менять настройки тестов, например, пути к файлам, типы отчетов, параметры браузера:
module.exports = function(config) {
config.set({
frameworks: ['mocha'],
files: ['src/**/*.js', 'test/**/*.spec.js'],
reporters: ['dots'],
browsers: ['Firefox'],
plugins: [
'karma-mocha',
'karma-firefox-launcher'
]
});
config.set = (function(originalSet) {
return function(cfg) {
cfg.browsers.push('ChromeHeadless'); // Добавляем браузер через декоратор
originalSet.call(this, cfg);
};
})(config.set);
};
Таким образом, без изменения основной конфигурации можно добавлять новые браузеры или изменять существующие параметры.
С помощью декораторов легко расширить возможности логирования тестов:
function logDecorator(logger) {
const originalError = logger.error;
logger.error = function(...args) {
console.error('[KARMA ERROR]:', ...args);
originalError.apply(logger, args);
};
return logger;
}
module.exports = function(config) {
config.set({
plugins: [
{'logger:custom': ['factory', logDecorator]}
]
});
};
Преимущество такого подхода — централизованное управление логами без изменения кода тестов или стандартных плагинов.
Karma позволяет создавать собственные репортеры, а декораторы упрощают модификацию существующих:
function customReporterDecorator(baseReporterDecorator) {
baseReporterDecorator(this);
this.onSpecCompl ete = function(browser, result) {
if(result.success) {
console.log(`Тест пройден в ${browser.name}: ${result.description}`);
} else {
console.warn(`Ошибка в ${browser.name}: ${result.description}`);
}
};
}
module.exports = function(config) {
config.set({
reporters: ['dots', 'custom'],
plugins: [
'karma-dots-reporter',
{'reporter:custom': ['type', customReporterDecorator]}
]
});
};
Декоратор добавляет дополнительное логирование к стандартному поведению репортера.
apply
или call.Декораторы в Karma представляют собой мощный инструмент для расширения и модификации тестового окружения. Их грамотное применение позволяет создавать гибкую инфраструктуру тестирования, добавлять логирование, изменять конфигурацию и настраивать плагины без изменения исходного кода тестов и основного конфигурационного файла.