Le service Angular 5 ne réussit pas les tests unitaires avec NullInjectorError: aucun fournisseur pour HttpClient!)

j'obtiens les erreurs suivantes lors de l'exécution des tests unitaires

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.specs.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();
      }
    )
  );
});

Je ne comprends pas ce qui ne va pas car J'ai inclus HttpClient dans l'api.service.ts, le service fonctionne dans le navigateur.

ceci est directement appelé dans un composant appelé MapComponent, et cela est appelé dans 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!
14
demandé sur R. Richards 2018-02-02 01:13:15

2 réponses

essayez d'emballer votre inject dans un async, comme ci-dessous:

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();
  })));

});

N'oubliez pas d'importer async@angular/core/testing.

j'ai eu un bon succès avec ce. Il est le seul différent de vos tests de l'unité et le mien où j'utilise HttpClientTestingModule.

6
répondu R. Richards 2018-02-01 22:32:44

je faisais face à " NullInjectorError: pas de fournisseur pour HttpClient!" question. Après avoir appliqué toutes les options disponibles suggérées en ligne, aucun n'a fonctionné pour mon unité angulaire de test.

enfin je viens d'ajouter la pièce ci-dessous dans mon.service.specs.ts fichier a réglé le problème.

  imports: [
        HttpClientModule,
    ],
5
répondu JP07 2018-07-05 21:31:03