angular 2 rc7 - 测试服务 - 错误:没有String的提供者

时间:2016-09-15 00:00:36

标签: unit-testing angular dependency-injection angular2-services

我在使用webpack快速入门项目进行角度2测试时遇到错误。

  

错误:没有String的提供者!在config / karma-test-shim.js

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

如果我更改为私人网址:任何我收到此错误

  

无法解析SbHttp的所有参数:(?,Headers,Http)。

1 个答案:

答案 0 :(得分:2)

您需要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,我不确定,但我认为一旦你解决了这个问题,你也可能会收到错误。我不确定你从哪里得到它。

如果您不熟悉DI with Angular,我强烈建议您查看Angular文档中的dependency injection chapter