CORS настройки

CORS в контексте Karma

Karma запускает тесты в реальных браузерах и взаимодействует с ними через локальный HTTP-сервер. Когда тестируемый код обращается к ресурсам, находящимся на другом домене, схеме или порте, возникают условия для проверки Cross-Origin Resource Sharing (CORS). Корректная настройка CORS в рамках инфраструктуры тестирования обеспечивает доступ к внешним API, статическим ресурсам и имитируемым сервисам.

Основные принципы

  • Браузер блокирует запросы без необходимых заголовков CORS.
  • Karma не добавляет CORS-заголовки автоматически; конфигурация зависит от используемых плагинов и прокси.
  • Для тестов, работающих с внешними API, требуется согласованность между серверной частью (или мок-сервером) и браузером.

Заголовки ответа

Обязательные элементы, которые должен вернуть сервер:

Access-Control-Allow-Origin — полный источник или символ-заполнитель *. Access-Control-Allow-Methods — список разрешённых HTTP-методов. Access-Control-Allow-Headers — перечень разрешённых кастомных заголовков. Access-Control-Allow-Credentials — при необходимости разрешает передачу cookie и заголовков авторизации.

При режиме withCredentials = true браузер не допустит * в Access-Control-Allow-Origin, требуется конкретный домен.

Префлайт-запросы

Для методов, выходящих за рамки простых (GET, POST, HEAD) и при наличии нестандартных заголовков, браузер выполняет OPTIONS-запрос. Сервер должен корректно отвечать на префлайт, возвращая совместимые заголовки и статус 200. В противном случае браузер заблокирует основной запрос, а тест завершится ошибкой.

Использование прокси в Karma

Karma поддерживает проксирование через секцию proxies в karma.conf.js. Прокси полезны для маршрутизации запросов из браузера на локальный тестовый бэкенд без смены origin. Это позволяет обходить CORS в учебных или лабораторных сценариях, когда сама проблема CORS не является предметом тестирования.

Пример использования прокси для перенаправления /api на локальный сервис:

module.exports = function(config) {
  config.set({
    proxies: {
      '/api': 'http://localhost:3000/api'
    }
  });
};

Поскольку запрос остаётся в рамках одного origin, браузеру не требуется CORS-разрешение. Такой подход применим для мок-серверов или stub-эндпоинтов.

Тестирование функционала с реальным CORS

При тестировании интеграции с настоящими удалёнными сервисами требуется:

  • Настроенный внешний сервис, отдающий корректные заголовки CORS.
  • Возможность обработки префлайт-запросов.
  • Совместимость с политикой передачи cookie, если требуется аутентификация.

Рекомендуется использовать промежуточный мок-слой, способный воспроизводить CORS-поведение внешних систем, чтобы тесты не зависели от доступности и скорости реальных API.

Параллельный запуск в разных браузерах

Разные браузерные движки могут отличаться поведением при проверке CORS. Safari, Firefox и Chrome по-разному трактуют некоторые пограничные случаи. Параллельный прогон через Karma помогает выявить несогласованности заголовков и специфик реализации.

Сервировка статических ресурсов

Когда тестируемый код загружает изображения, шрифты или модули, размещённые на другом домене, сервер этих ресурсов обязан отдавать соответствующие CORS-заголовки. Иначе браузер заблокирует ресурс до интерпретации. В Karma для таких ситуаций часто используют:

  • собственный статический сервер с встроенными заголовками CORS;
  • локальный CDN-заглушку;
  • механизм pre-bundling, чтобы свести количество внешних запросов к минимуму.

CORS и WebSockets

Некоторые приложения используют WebSocket-соединения. WebSocket не является частью классической CORS-модели, однако браузеры также проверяют origin на этапе установления соединения. При тестах в Karma требуется правильная настройка хостов и протоколов, иначе соединение будет отклонено.

Диагностика ошибок

Типичные проблемы:

  • Ошибка в консоли вида Blocked by CORS policy при отсутствии нужных заголовков.
  • Провал тестов из-за таймаутов при неуспешных префлайт-запросах.
  • Несовместимость в режиме withCredentials при использовании *.
  • Ложные ошибки из-за неработающих прокси или отсутствия маршрута.

Для анализа используют вкладку Network в девтулз браузера, оборачивая проблемные запросы фиктивными моками.

Практическая стратегия

При тестировании логики приложения — предпочтительнее использовать прокси или мок-сервера, минимизируя влияние CORS. При тестировании интеграции — полезно воспроизводить реальные CORS-условия и контролировать заголовки через вспомогательные сервисы. При разработке библиотек — показывать совместимость с CORS-политикой браузера в разных вариантах настроек.

Ключевые моменты

  • CORS — политика браузера, а не Karma.
  • Karma лишь облегчает воспроизведение условий, где браузер принимает решение.
  • Реалистичное тестирование требует корректной серверной поддержки заголовков.
  • Прокси в karma.conf.js упрощает локальную разработку и позволяет изолировать проблему.
  • Разные браузеры реагируют по-разному на одни и те же заголовки, что выявляется при параллельном тестировании.