diff --git a/packages/angular/build/src/builders/unit-test/runners/karma/index.ts b/packages/angular/build/src/builders/unit-test/runners/karma/index.ts index b4720e91f350..cc9bba0aa1be 100644 --- a/packages/angular/build/src/builders/unit-test/runners/karma/index.ts +++ b/packages/angular/build/src/builders/unit-test/runners/karma/index.ts @@ -22,12 +22,10 @@ const KarmaTestRunner: TestRunner = { checker.check('karma'); checker.check('karma-jasmine'); - // Check for browser launchers - if (options.browsers?.length) { - for (const browser of options.browsers) { - const launcherName = `karma-${browser.toLowerCase().split('headless')[0]}-launcher`; - checker.check(launcherName); - } + // A custom configuration loads its own launcher plugins and may define custom launchers. + // The built-in configuration only loads the Chrome launcher, which also provides Chromium. + if (!options.runnerConfig) { + checker.check('karma-chrome-launcher'); } if (options.coverage.enabled) { diff --git a/packages/angular/build/src/builders/unit-test/runners/karma/index_spec.ts b/packages/angular/build/src/builders/unit-test/runners/karma/index_spec.ts index 8d291f03775e..2e9f5f0876ef 100644 --- a/packages/angular/build/src/builders/unit-test/runners/karma/index_spec.ts +++ b/packages/angular/build/src/builders/unit-test/runners/karma/index_spec.ts @@ -11,10 +11,14 @@ import KarmaTestRunner from './index'; describe('KarmaTestRunner', () => { describe('validateDependencies', () => { - function createOptions(coverageEnabled: boolean): NormalizedUnitTestBuilderOptions { + function createOptions( + coverageEnabled: boolean, + options: Partial = {}, + ): NormalizedUnitTestBuilderOptions { return { projectSourceRoot: '/non-existent', coverage: { enabled: coverageEnabled }, + ...options, } as NormalizedUnitTestBuilderOptions; } @@ -29,5 +33,24 @@ describe('KarmaTestRunner', () => { /karma-coverage/, ); }); + + it('requires karma-chrome-launcher for Chromium with the built-in configuration', () => { + const options = createOptions(false, { browsers: ['ChromiumHeadless'] }); + + expect(() => KarmaTestRunner.validateDependencies?.(options)).toThrowError( + /^(?!.*karma-chromium-launcher).*karma-chrome-launcher/s, + ); + }); + + it('does not require launchers for the browsers of a custom configuration', () => { + const options = createOptions(false, { + browsers: ['ChromeNoSandbox'], + runnerConfig: 'karma.conf.js', + }); + + expect(() => KarmaTestRunner.validateDependencies?.(options)).toThrowError( + /^(?!.*-launcher)/s, + ); + }); }); });