From 5f4a8b182ba22708675f1caf1dedd4522f6485f6 Mon Sep 17 00:00:00 2001 From: Marius Bethge Date: Fri, 10 Jul 2026 12:19:59 +0000 Subject: [PATCH] fix(core): preserve change detection strategy when overriding component TestBed.overrideComponent previously caused JIT recompilation to overwrite a component's original ChangeDetectionStrategy. This ensures the component's existing ChangeDetectionStrategy is preserved when metadata overrides are applied. --- packages/core/src/metadata/directives.ts | 2 +- packages/core/test/test_bed_spec.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/core/src/metadata/directives.ts b/packages/core/src/metadata/directives.ts index ab1f8cd50b97..fa8b389008ca 100644 --- a/packages/core/src/metadata/directives.ts +++ b/packages/core/src/metadata/directives.ts @@ -679,7 +679,7 @@ export interface Component extends Directive { */ export const Component: ComponentDecorator = makeDecorator( 'Component', - (c: Component = {}) => ({changeDetection: ChangeDetectionStrategy.Eager, ...c}), + (c: Component = {}) => ({...c}), Directive, undefined, (type: Type, meta: Component) => compileComponent(type, meta), diff --git a/packages/core/test/test_bed_spec.ts b/packages/core/test/test_bed_spec.ts index 7d4703fa1f4a..89548ece19cc 100644 --- a/packages/core/test/test_bed_spec.ts +++ b/packages/core/test/test_bed_spec.ts @@ -428,6 +428,20 @@ describe('TestBed with Standalone types', () => { expect(fixture.nativeElement.innerHTML).toBe('Overridden'); }); + it('should preserve default change detection when overriding components', () => { + @Component({ + template: 'Original', + }) + class DefaultCmp {} + + const onPushBefore = (DefaultCmp as any).ɵcmp.onPush; + TestBed.overrideComponent(DefaultCmp, {set: {template: 'Overridden'}}); + TestBed.createComponent(DefaultCmp); + const onPushAfter = (DefaultCmp as any).ɵcmp.onPush; + + expect(onPushAfter).withContext('ɵcmp.OnPush after override').toBe(onPushBefore); + }); + it('should allow overriding the set of directives and pipes used in a standalone component', () => { @Directive({ selector: '[dir]',