fix(ivy): ngOnDestroy hooks should be called on providers (#27955)
PR Close #27955
This commit is contained in:

committed by
Kara Erickson

parent
996435b79a
commit
e775313188
@ -1167,23 +1167,22 @@ const TEST_COMPILER_PROVIDERS: Provider[] = [
|
||||
]);
|
||||
}));
|
||||
|
||||
fixmeIvy('FW-848: ngOnDestroy hooks are not called on providers')
|
||||
.it('should call ngOnDestroy on an injectable class', fakeAsync(() => {
|
||||
TestBed.overrideDirective(
|
||||
TestDirective, {set: {providers: [InjectableWithLifecycle]}});
|
||||
it('should call ngOnDestroy on an injectable class', fakeAsync(() => {
|
||||
TestBed.overrideDirective(
|
||||
TestDirective, {set: {providers: [InjectableWithLifecycle]}});
|
||||
|
||||
const ctx = createCompFixture('<div testDirective="dir"></div>', TestComponent);
|
||||
const ctx = createCompFixture('<div testDirective="dir"></div>', TestComponent);
|
||||
|
||||
ctx.debugElement.children[0].injector.get(InjectableWithLifecycle);
|
||||
ctx.detectChanges(false);
|
||||
ctx.debugElement.children[0].injector.get(InjectableWithLifecycle);
|
||||
ctx.detectChanges(false);
|
||||
|
||||
ctx.destroy();
|
||||
ctx.destroy();
|
||||
|
||||
// We don't care about the exact order in this test.
|
||||
expect(directiveLog.filter(['ngOnDestroy']).sort()).toEqual([
|
||||
'dir.ngOnDestroy', 'injectable.ngOnDestroy'
|
||||
]);
|
||||
}));
|
||||
// We don't care about the exact order in this test.
|
||||
expect(directiveLog.filter(['ngOnDestroy']).sort()).toEqual([
|
||||
'dir.ngOnDestroy', 'injectable.ngOnDestroy'
|
||||
]);
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -465,38 +465,37 @@ class TestComp {
|
||||
expect(comp.componentInstance.a).toBe('aValue');
|
||||
});
|
||||
|
||||
fixmeIvy('FW-848: ngOnDestroy hooks are not called on providers')
|
||||
.it('should support ngOnDestroy for lazy providers', () => {
|
||||
let created = false;
|
||||
let destroyed = false;
|
||||
it('should support ngOnDestroy for lazy providers', () => {
|
||||
let created = false;
|
||||
let destroyed = false;
|
||||
|
||||
class SomeInjectable {
|
||||
constructor() { created = true; }
|
||||
ngOnDestroy() { destroyed = true; }
|
||||
}
|
||||
class SomeInjectable {
|
||||
constructor() { created = true; }
|
||||
ngOnDestroy() { destroyed = true; }
|
||||
}
|
||||
|
||||
@Component({providers: [SomeInjectable], template: ''})
|
||||
class SomeComp {
|
||||
}
|
||||
@Component({providers: [SomeInjectable], template: ''})
|
||||
class SomeComp {
|
||||
}
|
||||
|
||||
TestBed.configureTestingModule({declarations: [SomeComp]});
|
||||
TestBed.configureTestingModule({declarations: [SomeComp]});
|
||||
|
||||
|
||||
let compRef = TestBed.createComponent(SomeComp).componentRef;
|
||||
expect(created).toBe(false);
|
||||
expect(destroyed).toBe(false);
|
||||
let compRef = TestBed.createComponent(SomeComp).componentRef;
|
||||
expect(created).toBe(false);
|
||||
expect(destroyed).toBe(false);
|
||||
|
||||
// no error if the provider was not yet created
|
||||
compRef.destroy();
|
||||
expect(created).toBe(false);
|
||||
expect(destroyed).toBe(false);
|
||||
// no error if the provider was not yet created
|
||||
compRef.destroy();
|
||||
expect(created).toBe(false);
|
||||
expect(destroyed).toBe(false);
|
||||
|
||||
compRef = TestBed.createComponent(SomeComp).componentRef;
|
||||
compRef.injector.get(SomeInjectable);
|
||||
expect(created).toBe(true);
|
||||
compRef.destroy();
|
||||
expect(destroyed).toBe(true);
|
||||
});
|
||||
compRef = TestBed.createComponent(SomeComp).componentRef;
|
||||
compRef.injector.get(SomeInjectable);
|
||||
expect(created).toBe(true);
|
||||
compRef.destroy();
|
||||
expect(destroyed).toBe(true);
|
||||
});
|
||||
|
||||
it('should instantiate view providers lazily', () => {
|
||||
let created = false;
|
||||
|
Reference in New Issue
Block a user