Работа с декораторами

Karma — это тестовый раннер для JavaScript, позволяющий запускать тесты в реальных браузерах и интегрироваться с различными фреймворками, такими как Jasmine, Mocha, QUnit. Одной из мощных возможностей Karma является расширяемость через декораторы, которые позволяют модифицировать поведение тестового окружения и конфигурации без изменения исходного кода тестов.


Понятие декораторов в 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 — некоторые плагины могут конфликтовать с декораторами.
  • Использовать декораторы для чистого разделения конфигурации и логики тестов.
  • Применять декораторы для динамических изменений при CI/CD, например, выбор браузеров в зависимости от среды.

Декораторы в Karma представляют собой мощный инструмент для расширения и модификации тестового окружения. Их грамотное применение позволяет создавать гибкую инфраструктуру тестирования, добавлять логирование, изменять конфигурацию и настраивать плагины без изменения исходного кода тестов и основного конфигурационного файла.