Angular 5 服务无法通过单元测试(NullInjectorError : No provider for HttpClient!)

标签 angular unit-testing typescript angular5

我在运行单元测试时不断收到以下错误

Error: StaticInjectorError(DynamicTestModule)[ApiService -> HttpClient]: 
      StaticInjectorError(Platform: core)[ApiService -> HttpClient]: 
        NullInjectorError: No provider for HttpClient!

api.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class ApiService {

  constructor(private http: HttpClient) { }
  url = './assets/data.json';

  get() {
    return this.http.get(this.url);
  }
}

api.service.spec.ts

import { TestBed, inject } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';

import { ApiService } from './api.service';

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

  it('should get users', inject([HttpTestingController, ApiService],
      (httpMock: HttpTestingController, apiService: ApiService) => {
        expect(apiService).toBeTruthy();
      }
    )
  );
});

我不明白哪里出了问题,因为我已将 HttpClient 包含到 api.service.ts 中,该服务在浏览器中运行。

这个是在一个叫做MapComponent的组件中直接调用的,那个是在HomeComponent内部调用的。

Chrome 63.0.3239 (Mac OS X 10.13.3) HomeComponent expect opened to be false FAILED
    Error: StaticInjectorError(DynamicTestModule)[ApiService -> HttpClient]: 
      StaticInjectorError(Platform: core)[ApiService -> HttpClient]: 
        NullInjectorError: No provider for HttpClient!

最佳答案

"NullInjectorError: No provider for HttpClient!" 的原因是 Unresolved 依赖项。在这种情况下,缺少 HttpClientModule

在你的 .service.spec.ts 文件中添加

  imports: [
        HttpClientTestingModule,
    ],

您可能会注意到我写的是 HttpClientTestingModule 而不是 HttpClientModule。原因是我们不想发送实际的 http 请求,而是使用测试框架的 Mock API。

关于Angular 5 服务无法通过单元测试(NullInjectorError : No provider for HttpClient!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48572621/

相关文章:

typescript - 在 typescript 中映射枚举

angular - 如何从 FormGroup 获取单个值

css - 在 Angular 2 组件中使用 Jquery ui slider 时闪烁

没有装饰器的类中的 Angular 2 服务注入(inject)

java - 如何使用 JUnit、EasyMock 或 PowerMock 模拟静态最终变量

node.js - 无法确定 Architect 命令 Angular4 的项目或目标

Swift 单元测试错误 : symbol(s) not found for architecture x86_64 (Swift Package Manager)

typescript - 如何完全覆盖对 NestJs http 请求进行单元测试?

Angular2 - *ngIf 和异步可观察对象

angular - 将参数传递给服务构造函数?