2016-05-05 55 views
1

我在http://plnkr.co/edit/ctjo8s8iUBPL9yUaVxP5?p=preview(通過對src/langaugesService.ts進行小改動從http://plnkr.co/edit/N3Acjuk7g9sPs35Rchjg?p=preview的工作示例改編)中說明了一個問題。我添加了構造函數。「服務測試中沒有字符串提供者」

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不能解決相關性時,DI通過null

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