diff --git a/modules/@angular/compiler/test/test_component_builder_spec.ts b/modules/@angular/compiler/test/test_component_builder_spec.ts index ae9b7ac674..7002c50c42 100644 --- a/modules/@angular/compiler/test/test_component_builder_spec.ts +++ b/modules/@angular/compiler/test/test_component_builder_spec.ts @@ -7,7 +7,7 @@ */ import {beforeEach, ddescribe, xdescribe, describe, expect, iit, inject, beforeEachProviders, it, xit,} from '@angular/core/testing/testing_internal'; -import {TestComponentBuilder, ComponentFixtureAutoDetect, ComponentFixtureNoNgZone} from '@angular/core/testing'; +import {TestComponentBuilder, ComponentFixtureAutoDetect, ComponentFixtureNoNgZone, withProviders} from '@angular/core/testing'; import {AsyncTestCompleter} from '@angular/core/testing/testing_internal'; import {Injectable, Component, Input, ViewMetadata} from '@angular/core'; import {NgIf} from '@angular/common'; @@ -15,7 +15,6 @@ import {TimerWrapper} from '../src/facade/async'; import {IS_DART} from '../src/facade/lang'; import {PromiseWrapper} from '../src/facade/promise'; import {dispatchEvent} from '@angular/platform-browser/testing/browser_util'; -import {withProviders} from '@angular/core/testing/test_injector'; @Component( {selector: 'child-comp', template: `Original {{childBinding}}`, directives: []}) diff --git a/modules/@angular/compiler/testing/test_component_builder.ts b/modules/@angular/compiler/testing/test_component_builder.ts index 8ec60a1817..76fa0202fb 100644 --- a/modules/@angular/compiler/testing/test_component_builder.ts +++ b/modules/@angular/compiler/testing/test_component_builder.ts @@ -7,12 +7,13 @@ */ import {AnimationEntryMetadata, Compiler, ComponentFactory, Inject, Injectable, Injector, NgZone, ViewMetadata} from '@angular/core'; -import {ComponentFixture, ComponentFixtureNoNgZone, TestComponentBuilder, TestInjector} from '@angular/core/testing'; +import {ComponentFixture, ComponentFixtureNoNgZone, TestBed, TestComponentBuilder} from '@angular/core/testing'; import {DirectiveResolver, ViewResolver} from '../index'; import {MapWrapper} from '../src/facade/collection'; import {ConcreteType, IS_DART, Type, isPresent} from '../src/facade/lang'; + /** * A TestComponentBuilder that allows overriding based on the compiler. */ @@ -31,7 +32,7 @@ export class OverridingTestComponentBuilder extends TestComponentBuilder { /** @internal */ _viewOverrides = new Map(); - constructor(@Inject(TestInjector) injector: Injector) { super(injector); } + constructor(@Inject(TestBed) injector: Injector) { super(injector); } /** @internal */ _clone(): OverridingTestComponentBuilder { diff --git a/modules/@angular/core/testing.ts b/modules/@angular/core/testing.ts index 71e7c6eaff..ad2ca6dac1 100644 --- a/modules/@angular/core/testing.ts +++ b/modules/@angular/core/testing.ts @@ -10,5 +10,5 @@ export * from './testing/async'; export * from './testing/component_fixture'; export * from './testing/fake_async'; export * from './testing/test_component_builder'; -export * from './testing/test_injector'; +export * from './testing/test_bed'; export * from './testing/testing'; diff --git a/modules/@angular/core/testing/test_injector.ts b/modules/@angular/core/testing/test_bed.ts similarity index 73% rename from modules/@angular/core/testing/test_injector.ts rename to modules/@angular/core/testing/test_bed.ts index da3608228b..154507e7fc 100644 --- a/modules/@angular/core/testing/test_injector.ts +++ b/modules/@angular/core/testing/test_bed.ts @@ -18,11 +18,12 @@ const UNDEFINED = new Object(); /** * @experimental */ -export class TestInjector implements Injector { +export class TestBed implements Injector { private _instantiated: boolean = false; private _compiler: Compiler = null; private _moduleRef: AppModuleRef = null; + private _appModuleFactory: AppModuleFactory = null; private _compilerProviders: Array = []; private _compilerUseJit: boolean = true; @@ -36,6 +37,7 @@ export class TestInjector implements Injector { reset() { this._compiler = null; this._moduleRef = null; + this._appModuleFactory = null; this._compilerProviders = []; this._compilerUseJit = true; this._providers = []; @@ -89,16 +91,43 @@ export class TestInjector implements Injector { } } - createInjectorSync(): Injector { + createAppModuleFactory(): Promise> { if (this._instantiated) { - return this; + throw new BaseException( + 'Cannot run precompilation when the test AppModule has already been instantiated. ' + + 'Make sure you are not using `inject` before `doAsyncPrecompilation`.'); } + + if (this._appModuleFactory) { + return Promise.resolve(this._appModuleFactory); + } + let moduleMeta = this._createCompilerAndModuleMeta(); - return this._createFromModuleFactory( - this._compiler.compileAppModuleSync(_NoopModule, moduleMeta)); + + return this._compiler.compileAppModuleAsync(_NoopModule, moduleMeta) + .then((appModuleFactory) => { + this._appModuleFactory = appModuleFactory; + return appModuleFactory; + }); } - createInjectorAsync(): Promise { + initTestAppModule() { + if (this._instantiated) { + return; + } + + if (this._appModuleFactory) { + this._createFromModuleFactory(this._appModuleFactory); + } else { + let moduleMeta = this._createCompilerAndModuleMeta(); + this._createFromModuleFactory(this._compiler.compileAppModuleSync(_NoopModule, moduleMeta)); + } + } + + /** + * @internal + */ + _createInjectorAsync(): Promise { if (this._instantiated) { return Promise.resolve(this); } @@ -115,7 +144,7 @@ export class TestInjector implements Injector { deprecatedAppProviders: this._providers }); const moduleMeta = new AppModuleMetadata({ - providers: this._providers.concat([{provide: TestInjector, useValue: this}]), + providers: this._providers.concat([{provide: TestBed, useValue: this}]), modules: this._modules.concat([this.appModule]), directives: this._directives, pipes: this._pipes, @@ -134,9 +163,9 @@ export class TestInjector implements Injector { get(token: any, notFoundValue: any = Injector.THROW_IF_NOT_FOUND) { if (!this._instantiated) { throw new BaseException( - 'Illegal state: The TestInjector has not yet been created. Call createInjectorSync/Async first!'); + 'Illegal state: The test bed\'s injector has not yet been created. Call initTestAppModule first!'); } - if (token === TestInjector) { + if (token === TestBed) { return this; } // Tests can inject things from the app module and from the compiler, @@ -148,23 +177,30 @@ export class TestInjector implements Injector { execute(tokens: any[], fn: Function): any { if (!this._instantiated) { throw new BaseException( - 'Illegal state: The TestInjector has not yet been created. Call createInjectorSync/Async first!'); + 'Illegal state: The test bed\'s injector has not yet been created. Call initTestAppModule first!'); } var params = tokens.map(t => this.get(t)); return FunctionWrapper.apply(fn, params); } } -var _testInjector: TestInjector = null; +var _testBed: TestBed = null; /** * @experimental */ -export function getTestInjector() { - if (_testInjector == null) { - _testInjector = new TestInjector(); +export function getTestBed() { + if (_testBed == null) { + _testBed = new TestBed(); } - return _testInjector; + return _testBed; +} + +/** + * @deprecated use getTestBed instead. + */ +export function getTestInjector() { + return getTestBed(); } /** @@ -208,12 +244,12 @@ export function setBaseTestProviders( * @experimental */ export function initTestEnvironment(appModule: Type, platform: PlatformRef) { - var testInjector = getTestInjector(); - if (testInjector.platform || testInjector.appModule) { + var testBed = getTestBed(); + if (testBed.platform || testBed.appModule) { throw new BaseException('Cannot set base providers because it has already been called'); } - testInjector.platform = platform; - testInjector.appModule = appModule; + testBed.platform = platform; + testBed.appModule = appModule; } /** @@ -231,10 +267,22 @@ export function resetBaseTestProviders() { * @experimental */ export function resetTestEnvironment() { - var testInjector = getTestInjector(); - testInjector.platform = null; - testInjector.appModule = null; - testInjector.reset(); + var testBed = getTestBed(); + testBed.platform = null; + testBed.appModule = null; + testBed.reset(); +} + +/** + * Run asynchronous precompilation for the test's AppModule. It is necessary to call this function + * if your test is using an AppModule which has precompiled components that require an asynchronous + * call, such as an XHR. Should be called once before the test case. + * + * @experimental + */ +export function doAsyncPrecompilation(): Promise { + let testBed = getTestBed(); + return testBed.createAppModuleFactory(); } /** @@ -262,39 +310,31 @@ export function resetTestEnvironment() { * @stable */ export function inject(tokens: any[], fn: Function): () => any { - let testInjector = getTestInjector(); + let testBed = getTestBed(); if (tokens.indexOf(AsyncTestCompleter) >= 0) { return () => { // Return an async test method that returns a Promise if AsyncTestCompleter is one of the // injected tokens. - return testInjector.createInjectorAsync().then(() => { - let completer: AsyncTestCompleter = testInjector.get(AsyncTestCompleter); - testInjector.execute(tokens, fn); + return testBed._createInjectorAsync().then(() => { + let completer: AsyncTestCompleter = testBed.get(AsyncTestCompleter); + testBed.execute(tokens, fn); return completer.promise; }); }; } else { return () => { - // Return a asynchronous test method with the injected tokens. - // TODO(tbosch): Right now, we can only detect the AsyncTestZoneSpec via its name. - // (see https://github.com/angular/zone.js/issues/370) - if (Zone.current.name.toLowerCase().indexOf('asynctestzone') >= 0) { - return testInjector.createInjectorAsync().then(() => testInjector.execute(tokens, fn)); - } else { - // Return a synchronous test method with the injected tokens. - try { - testInjector.createInjectorSync(); - } catch (e) { - if (e instanceof ComponentStillLoadingError) { - throw new Error( - `This test module precompiles the component ${stringify(e.compType)} which is using a "templateUrl", but the test is synchronous. ` + - `Please use the "async(...)" or "fakeAsync(...)" helper functions to make the test asynchronous.`); - } else { - throw e; - } + try { + testBed.initTestAppModule(); + } catch (e) { + if (e instanceof ComponentStillLoadingError) { + throw new Error( + `This test module precompiles the component ${stringify(e.compType)} which is using a "templateUrl", but precompilation was never done. ` + + `Please call "doAsyncPrecompilation" before "inject".`); + } else { + throw e; } - return testInjector.execute(tokens, fn); } + return testBed.execute(tokens, fn); }; } } @@ -314,14 +354,14 @@ export class InjectSetupWrapper { private _addModule() { var moduleDef = this._moduleDef(); if (moduleDef) { - getTestInjector().configureModule(moduleDef); + getTestBed().configureModule(moduleDef); } } inject(tokens: any[], fn: Function): () => any { return () => { this._addModule(); - return inject_impl(tokens, fn)(); + return inject(tokens, fn)(); }; } } @@ -346,9 +386,4 @@ export function withModule(moduleDef: () => { return new InjectSetupWrapper(moduleDef); } - -// This is to ensure inject(Async) within InjectSetupWrapper doesn't call itself -// when transpiled to Dart. -var inject_impl = inject; - class _NoopModule {} diff --git a/modules/@angular/core/testing/testing.ts b/modules/@angular/core/testing/testing.ts index eb60ea4b99..de9f880ce2 100644 --- a/modules/@angular/core/testing/testing.ts +++ b/modules/@angular/core/testing/testing.ts @@ -12,17 +12,17 @@ * allows tests to be asynchronous by either returning a promise or using a 'done' parameter. */ -import {TestInjector, getTestInjector} from './test_injector'; +import {TestBed, getTestBed} from './test_bed'; declare var global: any; var _global = (typeof window === 'undefined' ? global : window); -var testInjector: TestInjector = getTestInjector(); +var testBed: TestBed = getTestBed(); // Reset the test providers before each test. if (_global.beforeEach) { - _global.beforeEach(() => { testInjector.reset(); }); + _global.beforeEach(() => { testBed.reset(); }); } /** @@ -34,7 +34,7 @@ if (_global.beforeEach) { export function addProviders(providers: Array): void { if (!providers) return; try { - testInjector.configureModule({providers: providers}); + testBed.configureModule({providers: providers}); } catch (e) { throw new Error( 'addProviders can\'t be called after the injector has been already created for this test. ' + @@ -58,7 +58,7 @@ export function configureModule(moduleDef: { }): void { if (!moduleDef) return; try { - testInjector.configureModule(moduleDef); + testBed.configureModule(moduleDef); } catch (e) { throw new Error( 'configureModule can\'t be called after the injector has been already created for this test. ' + @@ -76,7 +76,7 @@ export function configureModule(moduleDef: { export function configureCompiler(config: {providers?: any[], useJit?: boolean}): void { if (!config) return; try { - testInjector.configureCompiler(config); + testBed.configureCompiler(config); } catch (e) { throw new Error( 'configureCompiler can\'t be called after the injector has been already created for this test. ' + diff --git a/modules/@angular/core/testing/testing_internal.ts b/modules/@angular/core/testing/testing_internal.ts index 75b4c9cbe6..d17dab2974 100644 --- a/modules/@angular/core/testing/testing_internal.ts +++ b/modules/@angular/core/testing/testing_internal.ts @@ -11,11 +11,11 @@ import {StringMapWrapper} from '../src/facade/collection'; import {Math, global, isFunction, isPromise} from '../src/facade/lang'; import {AsyncTestCompleter} from './async_test_completer'; -import {getTestInjector, inject} from './test_injector'; +import {getTestBed, inject} from './test_bed'; export {AsyncTestCompleter} from './async_test_completer'; export {MockAnimationPlayer} from './mock_animation_player'; -export {inject} from './test_injector'; +export {inject} from './test_bed'; export * from './logger'; export * from './ng_zone_mock'; export * from './mock_application_ref'; @@ -40,7 +40,7 @@ var inIt = false; jasmine.DEFAULT_TIMEOUT_INTERVAL = 3000; var globalTimeOut = jasmine.DEFAULT_TIMEOUT_INTERVAL; -var testInjector = getTestInjector(); +var testBed = getTestBed(); /** * Mechanism to run `beforeEach()` functions of Angular tests. @@ -61,7 +61,7 @@ class BeforeEachRunner { } // Reset the test providers before each test -jsmBeforeEach(() => { testInjector.reset(); }); +jsmBeforeEach(() => { testBed.reset(); }); function _describe(jsmFn: any /** TODO #9100 */, ...args: any[] /** TODO #9100 */) { var parentRunner = runnerStack.length === 0 ? null : runnerStack[runnerStack.length - 1]; @@ -110,7 +110,7 @@ export function beforeEachProviders(fn: any /** TODO #9100 */): void { jsmBeforeEach(() => { var providers = fn(); if (!providers) return; - testInjector.configureModule({providers: providers}); + testBed.configureModule({providers: providers}); }); } @@ -138,7 +138,7 @@ function _it(jsmFn: Function, name: string, testFn: Function, testTimeOut: numbe return new AsyncTestCompleter(); } }; - testInjector.configureModule({providers: [completerProvider]}); + testBed.configureModule({providers: [completerProvider]}); runner.run(); inIt = true; diff --git a/modules/@angular/platform-browser/test/testing_public_spec.ts b/modules/@angular/platform-browser/test/testing_public_spec.ts index 78c9881acb..930b9de76b 100644 --- a/modules/@angular/platform-browser/test/testing_public_spec.ts +++ b/modules/@angular/platform-browser/test/testing_public_spec.ts @@ -9,7 +9,7 @@ import {NgIf} from '@angular/common'; import {CompilerConfig, XHR} from '@angular/compiler'; import {AppModule, Component, ComponentFactoryResolver, Directive, Injectable, Input, Pipe, ViewMetadata, provide} from '@angular/core'; -import {TestComponentBuilder, addProviders, async, configureCompiler, configureModule, fakeAsync, inject, tick, withModule, withProviders} from '@angular/core/testing'; +import {TestComponentBuilder, addProviders, async, configureCompiler, configureModule, doAsyncPrecompilation, fakeAsync, inject, tick, withModule, withProviders} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/matchers'; import {stringify} from '../../http/src/facade/lang'; @@ -115,7 +115,10 @@ class CompUsingModuleDirectiveAndPipe { class SomeNestedModule { } -@Component({selector: 'comp', templateUrl: 'someTemplate.html'}) +@Component({ + selector: 'comp', + templateUrl: '/base/modules/@angular/platform-browser/test/static_assets/test.html' +}) class CompWithUrlTemplate { } @@ -296,27 +299,16 @@ export function main() { }); describe('precompile components with template url', () => { - let xhrGet: jasmine.Spy; - beforeEach(() => { - xhrGet = jasmine.createSpy('xhrGet').and.returnValue(Promise.resolve('Hello world!')); - configureCompiler({providers: [{provide: XHR, useValue: {get: xhrGet}}]}); - }); + beforeEach(async(() => { + configureModule({precompile: [CompWithUrlTemplate]}); + doAsyncPrecompilation(); + })); - it('should allow to precompile components with templateUrl using the async helper', - async(withModule(() => { - return {precompile: [CompWithUrlTemplate]}; - }).inject([ComponentFactoryResolver], (resolver: ComponentFactoryResolver) => { - expect(resolver.resolveComponentFactory(CompWithUrlTemplate).componentType) - .toBe(CompWithUrlTemplate); - }))); - - it('should allow to precompile components with templateUrl using the fakeAsync helper', - fakeAsync(withModule(() => { - return {precompile: [CompWithUrlTemplate]}; - }).inject([ComponentFactoryResolver], (resolver: ComponentFactoryResolver) => { - expect(resolver.resolveComponentFactory(CompWithUrlTemplate).componentType) - .toBe(CompWithUrlTemplate); - }))); + it('should allow to createSync components with templateUrl after async precompilation', + inject([TestComponentBuilder], (builder: TestComponentBuilder) => { + let fixture = builder.createSync(CompWithUrlTemplate); + expect(fixture.nativeElement).toHaveText('from external template\n'); + })); }); describe('setting up the compiler', () => { @@ -450,26 +442,27 @@ export function main() { configureCompiler({providers: [{provide: XHR, useValue: {get: xhrGet}}]}); }); - it('should report an error for precompile components with templateUrl and sync tests', () => { - var itPromise = patchJasmineIt(); + it('should report an error for precompile components with templateUrl which never call doAsyncPrecompile', + () => { + var itPromise = patchJasmineIt(); - expect( - () => it( - 'should fail', - withModule(() => { return {precompile: [CompWithUrlTemplate]}; }) - .inject( - [ComponentFactoryResolver], - (resolver: ComponentFactoryResolver) => { - expect( - resolver.resolveComponentFactory(CompWithUrlTemplate).componentType) - .toBe(CompWithUrlTemplate); - }))) - .toThrowError( - `This test module precompiles the component ${stringify(CompWithUrlTemplate)} which is using a "templateUrl", but the test is synchronous. ` + - 'Please use the "async(...)" or "fakeAsync(...)" helper functions to make the test asynchronous.'); + expect( + () => + it('should fail', + withModule(() => { return {precompile: [CompWithUrlTemplate]}; }) + .inject( + [ComponentFactoryResolver], + (resolver: ComponentFactoryResolver) => { + expect(resolver.resolveComponentFactory(CompWithUrlTemplate) + .componentType) + .toBe(CompWithUrlTemplate); + }))) + .toThrowError( + `This test module precompiles the component ${stringify(CompWithUrlTemplate)} which is using a "templateUrl", but precompilation was never done. ` + + 'Please call "doAsyncPrecompilation" before "inject".'); - restoreJasmineIt(); - }); + restoreJasmineIt(); + }); }); }); diff --git a/modules/@angular/platform-browser/test/web_workers/shared/message_bus_spec.ts b/modules/@angular/platform-browser/test/web_workers/shared/message_bus_spec.ts index 275046c793..e3dfafecf1 100644 --- a/modules/@angular/platform-browser/test/web_workers/shared/message_bus_spec.ts +++ b/modules/@angular/platform-browser/test/web_workers/shared/message_bus_spec.ts @@ -7,7 +7,7 @@ */ import {NgZone, provide} from '@angular/core'; -import {withProviders} from '@angular/core/testing/test_injector'; +import {withProviders} from '@angular/core/testing/test_bed'; import {MockNgZone, beforeEach, beforeEachProviders, describe, expect, inject, it} from '@angular/core/testing/testing_internal'; import {AsyncTestCompleter} from '@angular/core/testing/testing_internal'; import {MessageBus} from '@angular/platform-browser/src/web_workers/shared/message_bus'; diff --git a/modules/@angular/platform-browser/test/web_workers/worker/renderer_integration_spec.ts b/modules/@angular/platform-browser/test/web_workers/worker/renderer_integration_spec.ts index dc302a3069..ea1e7ca9ff 100644 --- a/modules/@angular/platform-browser/test/web_workers/worker/renderer_integration_spec.ts +++ b/modules/@angular/platform-browser/test/web_workers/worker/renderer_integration_spec.ts @@ -8,7 +8,7 @@ import {inject, ddescribe, describe, it, iit, expect, beforeEach, beforeEachProviders,} from '@angular/core/testing/testing_internal'; import {AsyncTestCompleter} from '@angular/core/testing/testing_internal'; -import {TestInjector, TestComponentBuilder, configureModule} from '@angular/core/testing'; +import {TestBed, TestComponentBuilder, configureModule} from '@angular/core/testing'; import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; import {provide, Injector, ViewMetadata, Component, Injectable, ComponentRef, ReflectiveInjector, getPlatform} from '@angular/core'; import {NgIf} from '@angular/common'; @@ -67,7 +67,7 @@ export function main() { beforeEach(() => { uiRenderStore = new RenderStore(); - var testUiInjector = new TestInjector(); + var testUiInjector = new TestBed(); testUiInjector.platform = browserDynamicTestPlatform(); testUiInjector.appModule = BrowserTestModule; testUiInjector.configureModule({ @@ -77,9 +77,9 @@ export function main() { {provide: RootRenderer, useExisting: DomRootRenderer} ] }); - uiInjector = testUiInjector.createInjectorSync(); - var uiSerializer = uiInjector.get(Serializer); - var domRootRenderer = uiInjector.get(DomRootRenderer); + testUiInjector.initTestAppModule(); + var uiSerializer = testUiInjector.get(Serializer); + var domRootRenderer = testUiInjector.get(DomRootRenderer); workerRenderStore = new RenderStore(); configureModule({ diff --git a/tools/public_api_guard/core/testing.d.ts b/tools/public_api_guard/core/testing.d.ts index 8e025bf1b9..09dbcbcde3 100644 --- a/tools/public_api_guard/core/testing.d.ts +++ b/tools/public_api_guard/core/testing.d.ts @@ -46,6 +46,9 @@ export declare function configureModule(moduleDef: { /** @experimental */ export declare function discardPeriodicTasks(): void; +/** @experimental */ +export declare function doAsyncPrecompilation(): Promise; + /** @experimental */ export declare function fakeAsync(fn: Function): (...args: any[]) => any; @@ -53,7 +56,10 @@ export declare function fakeAsync(fn: Function): (...args: any[]) => any; export declare function flushMicrotasks(): void; /** @experimental */ -export declare function getTestInjector(): TestInjector; +export declare function getTestBed(): TestBed; + +/** @deprecated */ +export declare function getTestInjector(): TestBed; /** @experimental */ export declare function initTestEnvironment(appModule: Type, platform: PlatformRef): void; @@ -82,6 +88,28 @@ export declare function resetTestEnvironment(): void; /** @deprecated */ export declare function setBaseTestProviders(platformProviders: Array, applicationProviders: Array): void; +/** @experimental */ +export declare class TestBed implements Injector { + appModule: Type; + platform: PlatformRef; + configureCompiler(config: { + providers?: any[]; + useJit?: boolean; + }): void; + configureModule(moduleDef: { + providers?: any[]; + directives?: any[]; + pipes?: any[]; + precompile?: any[]; + modules?: any[]; + }): void; + createAppModuleFactory(): Promise>; + execute(tokens: any[], fn: Function): any; + get(token: any, notFoundValue?: any): any; + initTestAppModule(): void; + reset(): void; +} + /** @stable */ export declare class TestComponentBuilder { protected _injector: Injector; @@ -103,28 +131,6 @@ export declare class TestComponentRenderer { insertRootElement(rootElementId: string): void; } -/** @experimental */ -export declare class TestInjector implements Injector { - appModule: Type; - platform: PlatformRef; - configureCompiler(config: { - providers?: any[]; - useJit?: boolean; - }): void; - configureModule(moduleDef: { - providers?: any[]; - directives?: any[]; - pipes?: any[]; - precompile?: any[]; - modules?: any[]; - }): void; - createInjectorAsync(): Promise; - createInjectorSync(): Injector; - execute(tokens: any[], fn: Function): any; - get(token: any, notFoundValue?: any): any; - reset(): void; -} - /** @experimental */ export declare function tick(millis?: number): void;