我在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);
});
})
答案 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