fix(ivy): apply all overrides from TestBed, not the last one only (#27734)
In some cases in our tests we can define multiple overrides for a given class. As a result, only the last override is actually applied due to the fact that we store overrides in a Type<->Override map. This update changes the logic to keep all overrides defined in a given test for a Type (i.e. Type<->Override[] map) and applies them one by one at resolution phase. This behavior is more inline with the previous TestBed. PR Close #27734
This commit is contained in:
parent
cdd737e28b
commit
509aa61619
|
@ -22,14 +22,18 @@ export interface Resolver<T> { resolve(type: Type<any>): T|null; }
|
|||
* Allows to override ivy metadata for tests (via the `TestBed`).
|
||||
*/
|
||||
abstract class OverrideResolver<T> implements Resolver<T> {
|
||||
private overrides = new Map<Type<any>, MetadataOverride<T>>();
|
||||
private overrides = new Map<Type<any>, MetadataOverride<T>[]>();
|
||||
private resolved = new Map<Type<any>, T|null>();
|
||||
|
||||
abstract get type(): any;
|
||||
|
||||
setOverrides(overrides: Array<[Type<any>, MetadataOverride<T>]>) {
|
||||
this.overrides.clear();
|
||||
overrides.forEach(([type, override]) => this.overrides.set(type, override));
|
||||
overrides.forEach(([type, override]) => {
|
||||
const overrides = this.overrides.get(type) || [];
|
||||
overrides.push(override);
|
||||
this.overrides.set(type, overrides);
|
||||
});
|
||||
}
|
||||
|
||||
getAnnotation(type: Type<any>): T|null {
|
||||
|
@ -42,10 +46,12 @@ abstract class OverrideResolver<T> implements Resolver<T> {
|
|||
if (!resolved) {
|
||||
resolved = this.getAnnotation(type);
|
||||
if (resolved) {
|
||||
const override = this.overrides.get(type);
|
||||
if (override) {
|
||||
const overrides = this.overrides.get(type);
|
||||
if (overrides) {
|
||||
const overrider = new MetadataOverrider();
|
||||
resolved = overrider.overrideMetadata(this.type, resolved, override);
|
||||
overrides.forEach(override => {
|
||||
resolved = overrider.overrideMetadata(this.type, resolved !, override);
|
||||
});
|
||||
}
|
||||
}
|
||||
this.resolved.set(type, resolved);
|
||||
|
|
|
@ -388,12 +388,11 @@ class CompWithUrlTemplate {
|
|||
.overridePipe(SomePipe, {set: {name: 'somePipe'}})
|
||||
.overridePipe(SomePipe, {add: {pure: false}});
|
||||
});
|
||||
fixmeIvy('FW-788: Support metadata override in TestBed (for AOT-compiled components)')
|
||||
.it('should work', () => {
|
||||
const compFixture = TestBed.createComponent(SomeComponent);
|
||||
compFixture.detectChanges();
|
||||
expect(compFixture.nativeElement).toHaveText('transformed hello');
|
||||
});
|
||||
it('should work', () => {
|
||||
const compFixture = TestBed.createComponent(SomeComponent);
|
||||
compFixture.detectChanges();
|
||||
expect(compFixture.nativeElement).toHaveText('transformed hello');
|
||||
});
|
||||
});
|
||||
|
||||
describe('template', () => {
|
||||
|
|
Loading…
Reference in New Issue