Angular 5服务无法通过单元测试(NullInjectorError:没有HttpClient的提供程序!)

35 unit-testing typescript angular angular5

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

Error: StaticInjectorError(DynamicTestModule)[ApiService -> HttpClient]: 
      StaticInjectorError(Platform: core)[ApiService -> HttpClient]: 
        NullInjectorError: No provider for HttpClient!
Run Code Online (Sandbox Code Playgroud)

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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();
      }
    )
  );
});
Run Code Online (Sandbox Code Playgroud)

我不明白出现了什么问题,因为我已将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!
Run Code Online (Sandbox Code Playgroud)

小智 39

我正面临着"NullInjectorError:没有HttpClient的提供者!" 问题.应用了在线建议的所有可用选项后,没有一个适用于我的角度单元测试.

最后在我的.service.spec.ts文件中添加下面的部分修复了问题.

  imports: [
        HttpClientTestingModule,
    ],
Run Code Online (Sandbox Code Playgroud)


M.O*_*vio 14

只需像这样添加它,

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientModule,
      ],
    }).compileComponents();
  });
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这解决了我的问题!顺便说一句,我不喜欢有角度的测试方式,因为它非常阴暗 - 事实上,这是我遇到的问题的第五个 stackoverflow 主题,告诉我以正确的方式编写这些测试非常复杂。我不知道我是否只需要了解更多有关角度测试的信息,或者其他人因为他们的测试机制很无聊而感到沮丧。 (5认同)

R. *_*rds 10

尝试包装你injectasync,如下所示:

import { TestBed, async, inject } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { ApiService } from './api.service';

describe('ApiService', () => {
    beforeEach(() => {
      ...
    });    

  it(`should create`, async(inject([HttpTestingController, ApiService],
    (httpClient: HttpTestingController, apiService: ApiService) => {
      expect(apiService).toBeTruthy();
  })));

});
Run Code Online (Sandbox Code Playgroud)

不要忘了导入async@angular/core/testing.

我在这方面取得了很大的成功.它与我的单元测试和我使用的地方唯一不同HttpClientTestingModule.