2017-03-15 14 views
1

私はまだAngular.io Heroesチュートリアルのバージョンのテストをプログラミングしています。コンポーネントのテストを書く際に、私は何か特有のものにぶつかります。私はこのテストに失敗することはできません。例えばAngular2、カルマ:fail()リクエストが失敗しない

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'); 
    });  
    }); 

}); 

は、このテストを実行し、何の障害が報告されていません。 try-catchに失敗をラップします。デバッガはfail()で一時停止します。しかし、あなたはcatch()を入力しません。カルマは常に成功を報告します。なぜそうなのか?

私のテストは機能していると証明できないので、これは私にとって重要です。私はこれらのfixture.whenStable()のクローンを含む複数のテストを書いていました。私は明らかに間違ったコードを持っていましたが、間違った点を一つだけ修正するとすぐにすべてのエラーメッセージが消えました。失敗を証明できないと、テストスイートがかなり無効になります。

回答ありがとうございました。 Jerome。あなたはasyncに包まれasync

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

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

を使用する必要があるので、

答えて

0

fixture.whenStable()は、非同期的に解決し、角度は、テストの完全なをさせる前に完了するために、すべての非同期タスクを待ちます。 asyncがないと、非同期whenStable()が解決される前にテストが完了します。

あなたのbeforeEach(async(()と同じです。 compileComponentsへの呼び出しは非同期的に解決されるため、完了するのを待つためにasyncにラップします。

もう一つの選択肢は、fixture.detectChanges()が実行されるいくつかの非同期タスクが発生すると仮定すると、tick

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

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

を呼び出すことにより、非同期タスクの解像度を強制することにより、同期「ようだ」我々はテストを行うために使用することができますfakeAsync/tickコンボを使用することです

012: tick()コールは

も参照してください。今、我々は、同期テストとしてテストを扱うことができ、完了するために、そのタスクを待ちます

+0

チュートリアルウェブサイトを持っていますか?私はいつもあなたの問題を解決しています! –

+0

いいえ、「チュートリアルサイト」はありません。私は[ブログ](https://psamsotha.github.io/)を持っていますが、私はここにいるように私はそれについて積極的ではありません –

関連する問題