【问题标题】:Service unit test expect(service).toBeTruthy() fails服务单元测试 expect(service).toBeTruthy() 失败
【发布时间】:2019-12-01 08:13:27
【问题描述】:

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

NullInjectorError: StaticInjectorError(DynamicTestModule)[HttpClient]:

StaticInjectorError(Platform: core)[HttpClient]:

NullInjectorError: 没有 HttpClient 的提供者!

我不明白这一点,因为在被测试的服务中我没有在哪里使用HttpClient

规格文件:

export class MockApiService {

  private apiUrl = 'apiUrl';

  get(endPoint: string) {
     return new Observable<{data: 'data'}>();
   }

   post(endPoint: string, data: any) {
     return new Observable<{data: 'data'}>();
   }

   patch(endPoint: string, data: any) {
     return new Observable<{data: 'data'}>();
   }

   getApiUrl() {
     return this.apiUrl;
   }
}

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

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

时隙服务文件:

@Injectable({
  providedIn: 'root'
})
export class TimeSlotService {

  constructor(private api: ApiService) { }

  static toPeriods(timeSlots: TimeSlot[]): string[] {
    const periods: string[] = [];
    for (const timeSlot of timeSlots) {
      periods.push(timeSlot.start + ' - ' + timeSlot.end);
    }
    return periods;
  }

  getTimeSlots() {
    return this.api.get('timeSlots')
      .pipe(map(ApiService.extractData));
  }
}

我在这里错过了什么?

【问题讨论】:

  • 不太确定错误,但您肯定还需要将您尝试测试的服务添加到您的 TestBed 提供商列表中。
  • @Erbsenkoenig 我实际上也尝试过,但它给出了同样的错误。但我会更改它,因为如果此错误消失,它仍然无法工作
  • @Erbsenkoenig 我很愚蠢,但你的建议确实解决了它......我之前在组件单元测试中尝试过你的建议,但在那里失败了,因此我很困惑。
  • 请不要问任何问题,一旦可行,请将问题更改为新问题。请打开一个新问题,否则我们给出的答案对阅读您的问题的任何人都没有任何意义。
  • @Erbsenkoenig 明白了,我会改回来

标签: angular unit-testing


【解决方案1】:

该错误具有误导性,您的 TestBed 提供商列表中缺少正在测试的服务。

【讨论】:

  • 如果有新问题,我会尽快查看。也许评论链接。这样就更容易找到了。
  • 由于发布限制,大约需要 90 分钟。到时候我会在这里发布链接。
  • 哦,好的。不用担心。那我去看看。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2021-03-28
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    相关资源
    最近更新 更多