fix(ivy): Handle overrides for {providedIn: AModule} in R3TestBed (#33606)
This issue was found when debugging a test failure that was using lazy loaded modules with the router. When doing this, the router calls `NgModuleFactory.create` for the loaded module. This module gets a new injector so the overrides provided in TestBed are not applied unless the Injectable is in the providers list (which is not the case for {providedIn...} Injectables). PR Close #33606
This commit is contained in:
@ -6,7 +6,7 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import {Compiler, Component, Directive, ErrorHandler, Inject, Injectable, InjectionToken, Input, ModuleWithProviders, NgModule, Optional, Pipe, getModuleFactory, ɵsetClassMetadata as setClassMetadata, ɵɵdefineComponent as defineComponent, ɵɵdefineNgModule as defineNgModule, ɵɵtext as text} from '@angular/core';
|
||||
import {Compiler, Component, Directive, ErrorHandler, Inject, Injectable, InjectionToken, Injector, Input, ModuleWithProviders, NgModule, Optional, Pipe, getModuleFactory, ɵsetClassMetadata as setClassMetadata, ɵɵdefineComponent as defineComponent, ɵɵdefineNgModule as defineNgModule, ɵɵtext as text} from '@angular/core';
|
||||
import {registerModuleFactory} from '@angular/core/src/linker/ng_module_factory_registration';
|
||||
import {NgModuleFactory} from '@angular/core/src/render3';
|
||||
import {TestBed, getTestBed} from '@angular/core/testing/src/test_bed';
|
||||
@ -409,6 +409,24 @@ describe('TestBed', () => {
|
||||
expect(service.get()).toEqual('override');
|
||||
});
|
||||
|
||||
it('overrides injectable that is using providedIn: AModule', () => {
|
||||
@NgModule()
|
||||
class ServiceModule {
|
||||
}
|
||||
@Injectable({providedIn: ServiceModule})
|
||||
class Service {
|
||||
}
|
||||
|
||||
const fake = 'fake';
|
||||
TestBed.overrideProvider(Service, {useValue: fake});
|
||||
// Create an injector whose source is the ServiceModule, not DynamicTestModule.
|
||||
const ngModuleFactory = TestBed.inject(Compiler).compileModuleSync(ServiceModule);
|
||||
const injector = ngModuleFactory.create(TestBed.inject(Injector)).injector;
|
||||
|
||||
const service = injector.get(Service);
|
||||
expect(service).toBe(fake);
|
||||
});
|
||||
|
||||
it('allow to override multi provider', () => {
|
||||
const MY_TOKEN = new InjectionToken('MyProvider');
|
||||
class MyProvider {}
|
||||
|
Reference in New Issue
Block a user