2016-06-28 5 views
5

私はRC3を使用しています。新しいAngular2ルータを実装しています:https://angular.io/docs/ts/latest/guide/router.htmlunit2テストにangle2サービスをどのように注入しますか? (RC3)

すべてはうまく動作しますが、単体テストで問題があります。具体的には、ユニットテストにAngular2サービスを注入できません。

マイ関連コンポーネントコード:

import {Component} from '@angular/core'; 
import {ActivatedRoute} from '@angular/router'; 

@Component({ 
    templateUrl: ... 
    styleUrls: ... 
}) 

export class Route1DetailComponent { 

    constructor(private route:ActivatedRoute) { 
    console.log(route); 
    } 
} 

私のユニットテストは、次のようになります

import { 
    expect, it, iit, xit, 
    describe, ddescribe, xdescribe, 
    beforeEach, beforeEachProviders, withProviders, 
    async, inject 
} from '@angular/core/testing'; 

import {ActivatedRoute} from '@angular/router'; 
import {Route1DetailComponent} from './route1-detail.component'; 
import {TestComponentBuilder} from '@angular/compiler/testing'; 

describe('route1-detail.component.ts',() => { 

    beforeEachProviders(() => [ 
    {provide: ActivatedRoute, useClass: ActivatedRoute} 
    ]); 

    it('should instantiate component', 
    async(inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: ActivatedRoute) => { 
     tcb.createAsync(Route1DetailComponent).then((fixture) => { 
     expect(fixture.componentInstance instanceof Route1DetailComponent).toBe(true, 'should create Route1DetailComponent'); 
     console.log(ar); 
    }); 
    }))); 

})。

'インスタンス化する必要があります'コンポーネントテストは失敗します。エラーは次のとおりです。

'ActivatedRoute'(?、?、?、?、?)のすべてのパラメータを解決できません。 すべてのパラメータがInjectで装飾されているか、 有効なタイプの注釈があり、「ActivatedRoute」は 注射可能で装飾されていることを確認してください。

これはどのように機能しますか?

注射しないと、ActivatedRouteすべて正常に機能します。

ありがとうございました。

+2

https://github.com/angular/angular/blob/fcfddbf79cfbdca45771bb31c0a2c1f55cff5801/modules/%40angular/router/test/router.spec.ts –

+0

がはるかにまだこの非常に便利なTHXに取り組んで感謝に役立つかもしれない - より多くのアイデアを歓迎します: ) – danday74

答えて

9

ユニットテストでは、通常の環境で使用されていないという理由だけで特定のサービスで問題が発生することがあります。単位テストがサービス全体を実行することなく、呼び出されたかどうかをテストすることができます。これを行うにはモッククラスを作成します。

describe('route1-detail.component.ts',() => { 

class MockActivatedRoute {} 

beforeEachProviders(() => [ 
    {provide: ActivatedRoute, useClass: MockActivatedRoute} 
    ]); 

it('should instantiate component', 
    async(inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: MockActivatedRoute) => { 
    tcb.createAsync(Route1DetailComponent).then((fixture) => { 
    expect(fixture.componentInstance instanceof Route1DetailComponent).toBe(true, 'should create Route1DetailComponent'); 
    console.log(ar); 
    }); 
}))); 

通知部分:inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: MockActivatedRoute。コードがActivatedRouteを探しているときは、モックサービスに渡しています。 もちろん、ActivatedRoute自体を単体テストしようとしている場合は、モックサービスを作成するとその目的を破ります。そのサービスからメソッドを呼び出そうとすると、モッククラスにメソッドや変数を追加しなければならないかもしれません。

+0

非常に有用なおかげ - まだこの上に取り組んで – danday74

+0

すばらしい答えであることが判明しました - ありがとうございました – danday74

+0

喜んで@ danday74を助ける – jhhoff02

関連する問題