我在使用 webpack quickstart 项目进行 Angular 2 测试时遇到错误。
Error: No provider for String! in config/karma-test-shim.js
我从未见过缺少 String 提供程序的错误。我发现它与服务构造函数中的私有(private) url:string 相关,但我该如何解决它?
这是我的测试文件
describe('http.ts',()=>{
beforeEach(()=>{
TestBed.configureTestingModule({
providers:[
SbHttp,
MockBackend,
BaseRequestOptions,
{ provide: Http, useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => {
return new Http(backend, defaultOptions);
}, deps: [MockBackend, BaseRequestOptions]}
],
imports: [
HttpModule
]
})
});
afterEach(()=>{
TestBed.resetTestingModule()
});
it('get() should work', inject([SbHttp],(sbHttp:SbHttp)=>{
expect(true).toBeTruthy()
}))
})
这是 SbHttp 服务
@Injectable()
export class SbHttp{
private baseUrl:string;
constructor( private url:string, private headers:Headers, private http:Http
){
this.baseUrl = utils.stripTrailingSlash(url)
}
}
如果我更改为私有(private) url:any 我会收到此错误
Can't resolve all parameters for SbHttp: (?, Headers, Http).
最佳答案
您需要通过 creating a token 使其可注入(inject),使用 @Inject()
注入(inject) token ,然后将其作为提供者添加到 providers
列表中。
import { OpaqueToken, Injct } from '@angular/core';
const APP_URL = new OpaqueToken('app.url');
class SbHttp {
constructor(@Inject(APP_URL) url: string, ...) {}
}
TestBed.configureTestingModule({
providers: [
{ provide: APP_URL, useValue: 'http://localhost' }
]
});
您还需要在真实应用中配置 providers
。至于 Headers
,我不确定,但我认为一旦你修复了这个问题,你也可能会遇到错误。我不确定您希望从哪里得到它。
我强烈建议您查看 dependency injection chapter如果您是使用 Angular 进行 DI 的新手,请参阅 Angular 文档。
关于unit-testing - angular 2 rc7 - 测试服务 - 错误 : No provider for String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39501353/