2016-05-05 12 views
1

http://plnkr.co/edit/ctjo8s8iUBPL9yUaVxP5?p=previewに問題があります(作業例のhttp://plnkr.co/edit/N3Acjuk7g9sPs35Rchjg?p=previewをsrc/langaugesService.tsに少し変更しています)。私はコンストラクタを追加しました。サービステストで "文字列のプロバイダがありません"

export class LanguagesService { 
    private type: string; 
    constructor(type: string) { 
    this.type = type; 
    } 
    get() { 
    return ['en', 'es', 'fr']; 
    } 
} 

以下のテストを修正するにはどうすればよいですか(src/languagesService.spec.ts)?

import {describe, it, expect, inject, beforeEach, beforeEachProviders} from 'angular2/testing'; 
import {LanguagesService} from './languagesService'; 

describe('Service: LanguagesService',() => { 
    let service; 

    beforeEachProviders(() => [ 
    LanguagesService 
    ]); 

    beforeEach(inject([LanguagesService], s => { 
    service = s; 
    })); 

    it('should return available languages',() => { 
    let languages = service.get(); 
    expect(languages).toContain('en'); 
    expect(languages).toContain('es'); 
    expect(languages).toContain('fr'); 
    expect(languages.length).toEqual(3); 
    }); 
}) 

答えて

1

あなたはそこDIによって注入されているクラスのコンストラクタのパラメータを持っている場合はDIがそれらを解決できるようにするために、これらのパラメータのために登録されているプロバイダにする必要があります。

stringの既定のプロバイダーはありません。文字列のプロバイダーを追加すると、通常は十分ではないため、購入することはほとんどありません。

何を行う可能性が代わりの文字列のキー(またはOpaqueToken

@Component({ 
    selector: 'my-app', 
    providers: [/* other providers, */ provide('languageType', {useValue: 'someValue})] 
    ... 
}) 

などで価値を提供することであり、その後、あなたのサービスが

@Injectable() 
export class LanguagesService { 
    private type: string; 
    constructor(@Inject('languageType) type: string) { 
    this.type = type; 
    } 
    get() { 
    return ['en', 'es', 'fr']; 
    } 
} 

のようになります。代わりにあなただけの議論をすることができますオプションの場合、DIは依存関係を解決できないときにnullを渡します。

@Injectable() 
export class LanguagesService { 
    private type: string; 
    constructor(@Optional() type: string) { 
    this.type = type; 
    } 
    get() { 
    return ['en', 'es', 'fr']; 
    } 
} 
関連する問題