refactor(ivy): create an Ivy version of tree-shakable providers test (#28477)

Due to the fact that the test in 'ng_module_integration_spec.ts' relied on internal VE data structures (the '_def' field) to verify the state and the structure has changed in Ivy, this commit adds an Ivy version of the same test.

PR Close #28477
This commit is contained in:
Andrew Kushnir 2019-01-31 09:50:43 -08:00 committed by Matias Niemelä
parent 36902e2f0e
commit 8930f60a4b
1 changed files with 32 additions and 2 deletions

View File

@ -14,7 +14,7 @@ import {NgModuleData} from '@angular/core/src/view/types';
import {tokenKey} from '@angular/core/src/view/util';
import {ComponentFixture, TestBed, inject} from '@angular/core/testing';
import {expect} from '@angular/platform-browser/testing/src/matchers';
import {fixmeIvy, modifiedInIvy, obsoleteInIvy} from '@angular/private/testing';
import {fixmeIvy, modifiedInIvy, obsoleteInIvy, onlyInIvy} from '@angular/private/testing';
import {InternalNgModuleRef, NgModuleFactory} from '../../src/linker/ng_module_factory';
import {clearModulesForTest} from '../../src/linker/ng_module_factory_loader';
@ -1316,7 +1316,7 @@ function declareTests(config?: {useJit: boolean}) {
});
describe('tree shakable providers', () => {
fixmeIvy('FW-794: NgModuleDefinition not exposed on NgModuleData')
modifiedInIvy('Ivy and VE have different internal fields to access providers')
.it('definition should not persist across NgModuleRef instances', () => {
@NgModule()
class SomeModule {
@ -1347,6 +1347,36 @@ function declareTests(config?: {useJit: boolean}) {
(ngModuleRef2 as NgModuleData)._def.providersByKey[tokenKey(Bar)];
expect(providerDef2).toBeUndefined();
});
onlyInIvy(`Ivy and VE have different internal fields to access providers`)
.it('definition should not persist across NgModuleRef instances', () => {
@NgModule()
class SomeModule {
}
class Bar {
static ngInjectableDef: InjectableDef<Bar> = defineInjectable({
factory: () => new Bar(),
providedIn: SomeModule,
});
}
const factory = createModuleFactory(SomeModule);
const ngModuleRef1 = factory.create(null);
// Inject a tree shakeable provider token.
ngModuleRef1.injector.get(Bar);
// Tree Shakeable provider definition should be available.
const providerDef1 = (ngModuleRef1 as any)._r3Injector.records.get(Bar);
expect(providerDef1).not.toBeUndefined();
// Instantiate the same module. The tree shakeable provider definition should not be
// present.
const ngModuleRef2 = factory.create(null);
const providerDef2 = (ngModuleRef2 as any)._r3Injector.records.get(Bar);
expect(providerDef2).toBeUndefined();
});
});
});
});