Angular 6 - NullInjectorError: нет провайдера для HttpClient в модульных тестах

Я импортирую и использую HttpClient в службе следующим образом:

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

@Injectable({
    providedIn: 'root',
})
export class MyService {
    constructor(private http: HttpClient) { }

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

Однако когда я запускаю ng test для своих модульных тестов и когда эти тесты используют службу, я получаю сообщение об ошибке:

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

В документации Angular 6 по HTTP просто сказано делать то, что я сделал. выше.


person Kingamere    schedule 13.12.2018    source источник
comment
Что такое код юнит-теста? Это имеет значение.   -  person JB Nizet    schedule 13.12.2018
comment
Возможный дубликат Ошибка Angular 4: нет поставщика для HttpClient   -  person Kevin Doyon    schedule 13.12.2018
comment
@KevinDoyon Нет, мой вопрос о неудачах в отношении модульных тестов, не иначе.   -  person Kingamere    schedule 13.12.2018
comment
И это именно то, о чем этот дубликат :) Скорее всего, вы не импортируете HttpClientModule в свой тест. Ваши тесты создают свои собственные модули. Если вы не импортируете HttpClientModule (или HttpClientTestingModule) туда, HttpClient не будет работать, потому что Angular об этом не знает. Неважно, что вы добавили HttpClientModule, скажем, к AppModule. Это должно быть в TestBed.configureTestingModule. Можно также импортировать SharedModule, если он у вас есть, пока HttpClientModule находится в exports. Но тест будет медленнее, потому что SharedModule будет содержать ненужный материал   -  person Kevin Doyon    schedule 13.12.2018
comment
@KevinDoyon Вы правы, спасибо, мне просто нужно было импортировать HttpClientTestingModule.   -  person Kingamere    schedule 13.12.2018


Ответы (2)


вы должны добавить HttpClient в импорт вашего модуля, в котором объявлен ваш компонент

@NgModule({
  declarations: [
    MyComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpClientModule
  ],
  providers: []
})
export class AppModule { }
person Derviş Kayımbaşıoğlu    schedule 13.12.2018
comment
Пользователь запрашивает модульное тестирование ... не использует его в службе - person Takatalvi; 13.12.2019

person    schedule
comment
Спасибо, мне просто нужно было добавить HttpClientTestingModule в массив imports в методе configureTestingModule. - person Kingamere; 13.12.2018
comment
Да, я хотел просто опубликовать это, но сказал, дайте заполнить, я рад, что это помогло - person The Dead Man; 14.12.2018
comment
работая для меня, я планировал добавить модуль в основной тест, вместо этого он должен быть добавлен в тесте службы - person Nather Webber; 29.04.2019
comment
Это помогло, но импортировать {HttpClientModule} из '@ angular / common / http'; в этом нет необходимости, поскольку тестовый класс на самом деле его не использует. - person iowatiger08; 11.09.2019
comment
Спасибо! Это сработало для меня в Angular 9. import {HttpClientTestingModule, HttpTestingController} из '@ angular / common / http / testing'; beforeEach (() = ›TestBed.configureTestingModule ({импортирует: [HttpClientTestingModule], поставщики: [myService]})); - person Hassan Raza; 07.06.2020
comment
Я потратил большую часть своего времени, пытаясь выяснить, как создать объект Jasmine Spy HttpClient, пока не нашел это решение. Спасибо. - person SavedBeau; 19.12.2020
comment
Было бы полезно описание того, что добавляет решение - почему оно работает. Без слов я вынужден провести визуальную разницу между сообщением OP и этим ответом. - person bob; 09.04.2021