I just started with Unit-Testing and I was able to mock my services and some of Angular and Ionic, but no matter what I do ChangeDetectorRef remains the same.
I mean, what kind of witchcraft is this?
beforeEach(async(() => TestBed.configureTestingModule({ declarations: [MyComponent], providers: [ Form, DomController, ToastController, AlertController, PopoverController, {provide: Platform, useClass: PlatformMock}, { provide: NavParams, useValue: new NavParams({data: new PageData().Data}) }, {provide: ChangeDetectorRef, useClass: ChangeDetectorRefMock} ], imports: [ FormsModule, ReactiveFormsModule, IonicModule ], }) .overrideComponent(MyComponent, { set: { providers: [ {provide: ChangeDetectorRef, useClass: ChangeDetectorRefMock}, ], viewProviders: [ {provide: ChangeDetectorRef, useClass: ChangeDetectorRefMock}, ] } }) .compileComponents() .then(() => { let fixture = TestBed.createComponent(MyComponent); let cmp = fixture.debugElement.componentInstance; let cdRef = fixture.debugElement.injector.get(ChangeDetectorRef); console.log(cdRef);
it('fails no matter what', async(() => { spyOn(cdRef, 'markForCheck'); spyOn(cmp.cdRef, 'markForCheck'); cmp.ngOnInit(); expect(cdRef.markForCheck).toHaveBeenCalled(); // fail, why ?? expect(cmp.cdRef.markForCheck).toHaveBeenCalled(); // success console.log(cdRef); // logs ChangeDetectorRefMock console.log(cmp.cdRef); // logs ChangeDetectorRef , why ?? }));
@Component({ ... }) export class MyComponent { constructor(private cdRef: ChangeDetectorRef){} ngOnInit() {
I tried everything, async , fakeAsync , injector([ChangeDetectorRef], () => {}) .
Nothing works.