Включение файлов

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

Файл конфигурации karma.conf.js

Вся логика включения файлов определяется в файле конфигурации karma.conf.js. Основные свойства, отвечающие за подключение ресурсов:

  • files — массив файлов и шаблонов, которые необходимо загрузить.
  • exclude — массив файлов или шаблонов, которые необходимо исключить.
  • preprocessors — указывает, какие файлы требуют предварительной обработки (например, транспиляции через Babel).

Пример базовой структуры:

module.exports = function(config) {
  config.set({
    frameworks: ['jasmine'],
    files: [
      'src/**/*.js',
      'test/**/*.spec.js'
    ],
    exclude: [
      'src/experimental/**'
    ],
    preprocessors: {
      'src/**/*.js': ['babel']
    },
    browsers: ['Chrome'],
    singleRun: true
  });
};

В этом примере подключаются все JavaScript-файлы из src и все тесты из test, исключая экспериментальные модули. Файлы из src проходят через Babel для трансляции.

Порядок подключения файлов

Порядок файлов в массиве files критически важен:

  1. Библиотеки. Сначала подключаются внешние зависимости (например, Angular, React, Lodash).
  2. Исходный код. Затем подключаются модули приложения.
  3. Тесты. В конце подключаются сами тестовые файлы.

Нарушение порядка может приводить к ошибкам ReferenceError или TypeError, когда тест пытается использовать ещё не загруженный модуль.

Использование шаблонов (glob patterns)

Karma поддерживает шаблоны для указания множества файлов:

  • 'src/**/*.js' — все .js файлы в папке src и её подкаталогах.
  • 'test/*Spec.js' — только файлы с конкретным суффиксом.
  • {pattern: 'src/**/*.js', watched: true, served: true, included: true} — более детальная настройка.

Параметры шаблона:

  • watched — если true, Karma будет отслеживать изменения и автоматически перезапускать тесты.
  • served — если true, файл будет доступен через веб-сервер Karma.
  • included — если true, файл будет автоматически вставлен через тег <script> в браузер.

Исключение файлов

Массив exclude позволяет убрать лишние файлы из загрузки, например:

exclude: [
  'src/**/*.min.js',
  'src/legacy/**'
]

Это предотвращает конфликт версий библиотек или подключение устаревшего кода.

Подключение внешних библиотек

Для библиотек, которые не являются модульными, можно использовать путь к CDN или локальный файл в files:

files: [
  'node_modules/jquery/dist/jquery.min.js',
  'src/**/*.js',
  'test/**/*.spec.js'
]

Если библиотека должна быть доступна для тестов, но не вставляться в браузер автоматически, используется настройка included: false.

Предобработка файлов

Karma поддерживает preprocessors для обработки файлов перед выполнением тестов. Часто применяются:

  • babel — транспиляция ES6+ в ES5.
  • coverage — генерация отчета по покрытию кода.
  • webpack — сборка модулей через Webpack.

Пример конфигурации:

preprocessors: {
  'src/**/*.js': ['babel', 'coverage'],
  'test/**/*.spec.js': ['babel']
}

Специальные случаи

  • Тестирование CSS или HTML. Для шаблонов Angular или React можно использовать ng-html2js или html2js preprocessors.
  • Асинхронная загрузка модулей. Для RequireJS или SystemJS файлы подключаются через included: false, а загрузка управляется модульным загрузчиком.

Проверка доступности файлов

После запуска Karma можно убедиться, что все файлы корректно загружены. В браузере открывается панель с загруженными скриптами. Ошибки 404 указывают на неправильный путь или неверный шаблон.

Рекомендации по организации файлов

  • Разделять исходный код и тесты в разных директориях (src/ и test/).
  • Использовать единый шаблон для тестов (**/*.spec.js) для удобного автоматического обнаружения.
  • Исключать minified и устаревшие файлы из files и exclude.
  • Подключать библиотеки до исходного кода, чтобы избежать проблем с зависимостями.

Файл конфигурации Karma, настроенный правильно, позволяет полностью контролировать порядок загрузки и подготовку всех ресурсов, что является основой стабильного и предсказуемого тестирования JavaScript.