服务测试中没有“String的提供者”

时间:2016-05-05 15:43:58

标签: angular

我在http://plnkr.co/edit/ctjo8s8iUBPL9yUaVxP5?p=preview处有一个问题(通过对{rc / 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 个答案:

答案 0 :(得分:1)

当你有由DI注入的类的构造函数参数时,需要为这些参数注册的提供者才能解析它们。

string没有默认提供商,为字符串添加提供商不会给你带来太大的影响,因为该类型通常不够具体。

您可以做的是使用字符串键提供值(或者像{/ 1}}

OpaqueToken

然后您的服务应该是

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

或者你可以使参数只是可选的,然后当DI无法解析依赖关系时DI传递@Injectable() export class LanguagesService { private type: string; constructor(@Inject('languageType) type: string) { this.type = type; } get() { return ['en', 'es', 'fr']; } }

null