2017-03-15 2 views
1

Ich programmiere immer noch Tests für eine Version des Angular.io Heroes Tutorials. Beim Schreiben eines Tests für eine Komponente stoße ich auf etwas Eigenartiges. Ich kann diesen Test nicht zum Scheitern bringen.Angular2, Karma: fail() Anfragen NOT failing

Zum Beispiel:

describe('OrgDetailComponent',() => { 

    let comp: OrgDetailComponent; 
    let fixture: ComponentFixture<OrgDetailComponent>; 
    let de: DebugElement; 
    let el: HTMLElement; 

    let org1: Org = new Org({ ... fills Org ... }); 

    let dialogService: DialogService = null; 
    let globalsService: GlobalsService = null; 
    let orgService: OrgService = null; 
    let routeStub: any = { data: Observable.of({ org: org1 }) } ; 

    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     imports: [ FormsModule, RouterTestingModule ], 
     providers : [ 
      { provide: DialogService, useClass: MockDialogService }, 
      { provide: GlobalsService, useClass: MockGlobalsService }, 
      { provide: OrgService, useClass: MockOrgService }, 
      { provide: ActivatedRoute, useValue: routeStub }   
     ], 
     declarations: [ OrgDetailComponent ], 
    }) 
    .compileComponents(); 
    })); 

    beforeEach(() => { 
    fixture = TestBed.createComponent(OrgDetailComponent); 

    dialogService = fixture.debugElement.injector.get(DialogService); 
    globalsService = fixture.debugElement.injector.get(GlobalsService); 
    orgService = fixture.debugElement.injector.get(OrgService); 
    }); 

    it('should always fail',() => { 
    fixture.detectChanges(); 
    fixture.whenStable().then(() => { 
     fail('forced fail'); 
    });  
    }); 

}); 

Führen Sie diesen Test und keine Fehler gemeldet werden. Wickeln Sie den Fehler in einen Versuchfang ein. Der Debugger pausiert bei fail(). Aber du gibst den catch() nicht ein. Karma meldet immer Erfolg. Whyso?

Dies ist relevant für mich, weil ich nicht beweisen kann, dass meine Tests funktionieren. Ich schrieb mehrere Tests mit Klonen dieser Fixture.whenStable(). Ich hatte demonstrativ falschen Code, aber sobald ich nur eine Sache korrigierte, die falsch war, verschwand jede Fehlermeldung. Nicht in der Lage zu sein, einen Fehler zu beweisen, macht die Testsuite ziemlich ungültig.

Danke für alle Antworten, Jerome.

Antwort

0

fixture.whenStable() löst asynchron, so müssen Sie async

import { async } from '@angular/core/testing' 

it('should always fail', async(() => { 
    fixture.detectChanges(); 
    fixture.whenStable().then(() => { 
    fail('forced fail'); 
    });  
})); 

in async verwenden, eingewickelt, Angular für alle asynchronen Aufgaben warten abgeschlossen ist, bevor der Test abgeschlossen lassen. Ohne die async wird der Test abgeschlossen, bevor die asynchrone whenStable() verrechnet.

Es ist genau wie in Ihrem beforeEach(async((). Der Aufruf an compileComponents löst asynchron auf, also wickeln Sie ihn in async ein, um darauf zu warten, dass es abgeschlossen wird.

Weitere Optionen ist fakeAsync/tick Combo zu verwenden, was wir machen Test verwenden können „scheinen“ synchron durch Auflösung von Asynchron-Aufgaben zwingt durch tick

import { fakeAsync, tick } from '@angular/core/testing' 

it('should always fail', fakeAsync(() => { 
    fixture.detectChanges(); 
    tick() 
    expect(...)  
})); 

fixture.detectChanges() Unter der Annahme Aufruf bewirkt, dass einige asynchrone Aufgaben durchgeführt werden, die tick() Anruf wird für diese Aufgabe abgeschlossen warten, so können wir jetzt den Test als Synchrontest

Siehe auch behandeln:

+0

Haben Sie ein Tutorial Website? Ich bekomme immer meine Fragen von Ihnen beantwortet! –

+0

Nein, keine "Tutorial-Site". Ich habe einen [Blog] (https://psamsotha.github.io/), aber ich bin nicht so aktiv darauf wie ich hier bin –