Angular 服务单元测试expect(Service).toBeTruthy()失败

Angular 服务单元测试expect(Service).toBeTruthy()失败,angular,unit-testing,Angular,Unit Testing,我想为服务编写单元测试。第一次测试失败, 出现此错误时: NullInjectorError:StaticInjectorError(DynamicTestModule)[HttpClient]: StaticInjectorError(平台:核心)[HttpClient]: NullInjectorError:HttpClient没有提供程序 我不理解这一点,因为在测试的服务中,我不知道在哪里使用HttpClient 等级库文件: 导出类MockApiService{ 私有apiUrl='ap

我想为服务编写单元测试。第一次测试失败, 出现此错误时:

NullInjectorError:StaticInjectorError(DynamicTestModule)[HttpClient]:

StaticInjectorError(平台:核心)[HttpClient]:

NullInjectorError:HttpClient没有提供程序

我不理解这一点,因为在测试的服务中,我不知道在哪里使用
HttpClient

等级库文件:

导出类MockApiService{
私有apiUrl='apiUrl';
获取(端点:字符串){
返回新的可观察();
}
post(端点:字符串,数据:任意){
返回新的可观察();
}
修补程序(端点:字符串,数据:任意){
返回新的可观察();
}
getApiUrl(){
返回此.apirl;
}
}
描述('TimeSlotService',()=>{
在每个(()=>TestBed.configureTestingModule之前({
供应商:[
TimeSlotService,
{provide:ApiService,useValue:MockApiService}
]
}));
它('应该创建',()=>{
常量服务:TimeSlotService=TestBed.get(TimeSlotService);
expect(service.toBeTruthy();
});
});
时隙服务文件:

@可注入({
providedIn:'根'
})
导出类时隙服务{
构造函数(私有api:ApiService){}
静态TopPeriods(时隙:时隙[]):字符串[]{
常量周期:字符串[]=[];
for(常量时隙或时隙){
推送(timeSlot.start+'-'+timeSlot.end);
}
重现期;
}
getTimeSlots(){
返回此.api.get('timeSlots')
.管道(地图(ApiService.extractData));
}
}

我在这里遗漏了什么?

Angular告诉您,它无法注入
HttpClient
,因此您可以轻松地通过导入
HttpClientTestingModule来修复

describe('TimeSlotService', () => {
  beforeEach(() => TestBed.configureTestingModule({
    providers: [
      { provide: ApiService, useValue: MockApiService }
    ],
    imports: [ HttpClientTestingModule ]
  }));

  it('should be created', () => {
    const service: TimeSlotService = TestBed.get(TimeSlotService);
    expect(service).toBeTruthy();
  });
});

此修复程序无法解决您对HttpClient使用的误解。也许您不应该使用
useValue
,但是
useClass

错误是误导性的,您缺少测试床提供程序列表中正在测试的服务。

对错误不太确定,但您确实需要将您尝试测试的服务添加到您的测试床提供程序列表中。@Erbsenkoenig我实际上也尝试过,但它给出了相同的错误。但我会改变它,因为如果这个错误发生,它仍然不起作用away@Erbsenkoenig我真傻,但你的建议确实解决了问题。。。我以前在组件单元测试中尝试过你的建议,但失败了,因此我感到困惑。请不要问问题,一旦这个问题起作用,就把问题换成新的问题。请打开一个新问题,否则我们给出的答案对任何阅读您的问题的人来说都没有任何意义。@Erbsenkoenig明白,我会把它改回来的。我会尽快查看新问题。也许评论一下链接。这样就更容易找到了。由于帖子限制,大约需要90分钟。到时候我会在这里发布链接。哦,好的。别担心。那我去看看。[新问题]