angular 2 rc7 - testing service - Error: No provider for String

angular 2 rc7 - testing service - Error: No provider for String

我在 angular 2 使用 webpack quickstart 项目进行测试时遇到错误。

Error: No provider for String! in config/karma-test-shim.js

我从未见过缺少字符串提供程序的错误。我发现它与服务构造函数中的私有 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)
    }
}

如果我更改为私有 url:any 我会收到此错误

Can't resolve all parameters for SbHttp: (?, Headers, Http).

您需要通过 creating a token 使其可注入,使用 @Inject() 注入令牌,然后将其作为提供者添加到 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,我不确定,但我认为一旦你修复了这个错误,你也可能会遇到错误。我不确定你希望从哪里得到它。

如果您是 Angular.

的 DI 新手,我强烈建议您查看 Angular 文档中的 dependency injection chapter