Angular 错误:StaticInjectorError(DynamicTestModule)[CityService->;Http]:没有Http的提供程序

Angular 错误:StaticInjectorError(DynamicTestModule)[CityService->;Http]:没有Http的提供程序,angular,typescript,testing,jasmine,Angular,Typescript,Testing,Jasmine,我有一个从ws返回所有城市的服务 @Injectable() export class CityService { constructor(private http: Http, private router: Router, private auth: AuthService) { } public getAllCity(): Observable<City[]> { let headers = new Headers(); headers.appen

我有一个从ws返回所有城市的服务

@Injectable()
export class CityService {
  constructor(private http: Http, private router: Router,
  private auth: AuthService) { }

  public getAllCity(): Observable<City[]> {
    let headers = new Headers();
    headers.append('x-access-token', this.auth.getCurrentUser().token);
    return this.http.get(Api.getUrl(Api.URLS.getAllCity), {
      headers: headers
    })
      .map((response: Response) => {
        let res = response.json();
        if (res.StatusCode === 1) {
          this.auth.logout();
        } else {
          return res.StatusDescription.map(city => {
            return new City(city);
          });
        }
      });
  }
}
我尝试了此代码,但显示错误:

错误:StaticInjectorError(DynamicTestModule)[CityService->Http]:
StaticInjectorError(平台:核心)[CityService->Http]: NullInjectorError:没有Http的提供程序

如何测试/如何在ng测试中显示我的城市


这是我第一次尝试,你能给我推荐一些像我的代码这样的例子或教程吗?

CityService
依赖于三种服务,即
Http
Router
AuthService
。您需要将它们注入测试

describe('Service: City', () => {
    let service: CityService;

    beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [],
            providers: [CityService, AuthService],  // all all services upon which AuthService depends
            imports: [RouterTestingModule, HttpClientTestingModule], 
        });
    });

    beforeEach(() => {
        service = TestBed.get(CityService);
    });

    it('#getAllCity should return real value', () => {
        expect(service.getAllCity()).toBe('real value');
    });
});
-这是单元测试的必读资料。 -与测试服务相关的部分。
-与测试使用Http服务进行的调用相关。

我修改
提供程序:[CityService,Http,AuthService,ConnectionBackend],导入:[RouterTestingModule,HttpModule]
现在显示此错误:TypeError:无法读取Null的属性“token”.这是另一个问题,与此问题无关。您不应该将真正的http客户端注入测试上下文;单元测试会进行网络调用,我认为它无论如何都不会起作用。感谢@jornsharpe的评论,我更新了答案。
错误:StaticInjectorError(DynamicTestModule)[CityService->Http]:StaticInjectorError(Platform:core)[CityService->Http]:NullInjectorError:没有Http的提供程序你解决了这个问题吗?是的当然@gentlyawesome
describe('Service: City', () => {
    let service: CityService;

    beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [],
            providers: [CityService, AuthService],  // all all services upon which AuthService depends
            imports: [RouterTestingModule, HttpClientTestingModule], 
        });
    });

    beforeEach(() => {
        service = TestBed.get(CityService);
    });

    it('#getAllCity should return real value', () => {
        expect(service.getAllCity()).toBe('real value');
    });
});