Каждая конфигурация тестирования Angular, использующая TestBed, начинается со следующей инициализации:
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
Среда углового тестирования будет использовать BrowserDynamicTestingModule для создания инжектора, как это работает для обычных угловых модулей (см. Также https://blog.angularindepth.com/angular-dependency-injection-and-tree-shakeable-tokens-4588a8f70d5d).
Поставщики угловых слияний, которые BrowserDynamicTestingModule
содержат. Этот модуль объявлен следующим образом:
@NgModule({
exports: [BrowserTestingModule],
providers: [
{provide: TestComponentRenderer, useClass: DOMTestComponentRenderer},
]
})
export class BrowserDynamicTestingModule {
}
где BrowserTestingModule
выглядит так:
/\
||
@NgModule({
exports: [BrowserModule],
providers: [
{provide: APP_ID, useValue: 'a'},
ELEMENT_PROBE_PROVIDERS,
{provide: NgZone, useFactory: createNgZone},
]
})
export class BrowserTestingModule {
}
и BrowserModule
:
/\
||
@NgModule({providers: BROWSER_MODULE_PROVIDERS, exports: [CommonModule, ApplicationModule]})
export class BrowserModule {
...
}
и наконец ApplicationModule
объявляет ApplicationRef
:
/\
||
export const APPLICATION_MODULE_PROVIDERS: StaticProvider[] = [
{
provide: ApplicationRef,
useClass: ApplicationRef,
deps:
[NgZone, Console, Injector, ErrorHandler, ComponentFactoryResolver, ApplicationInitStatus]
},
...
];
@NgModule({providers: APPLICATION_MODULE_PROVIDERS})
export class ApplicationModule {
// Inject ApplicationRef to make it eager...
constructor(appRef: ApplicationRef) {}
}
и, как вы можете видеть, ApplicationRef
провайдер также охотно создается.
Таким образом, здесь нет никакой магии, Angular просто использует тот же алгоритм, как если бы он разрешал провайдеров из пользовательских NgModules