Ich erkunde das neue Angular HttpClientModule und stolperte in einen unerklärlichen Fehler. Das Modul ist neu genug, dass ich noch keine brauchbaren Informationen zum Komponententest finden kann, und die offizielle Dokumentation enthält keine Beispiele.Fehler beim Komponententest HttpClientModule (Angular 4.3+)
Die App enthält einen Dienst mit einer Methode, die eine URL an http.get
übergibt. Wenn ich diese Methode in einem Browser-Kontext (alias ng serve
) aufrufen, wird der http-Aufruf normal ausgeführt. Wenn im Rahmen eines Unit-Test genannt, bekomme ich folgende Fehlermeldung:
TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
Dies ist ein minimal-App ist mit kantigem CLI erzeugt. Hier ist der relevante Code:
app.module.ts:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { AppComponent } from './app.component';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, HttpClientModule],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
app.component.ts:
import { Component, OnInit } from '@angular/core';
import { TestService } from './test.service'
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
providers: [TestService]
})
export class AppComponent {
title = 'app';
constructor(private testSvc: TestService) {}
ngOnInit() {
this.testSvc.executeGet('http://www.example.com');
}
}
test.service.ts:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class TestService {
constructor(private http:HttpClient) {}
executeGet(url:string) {
this.http.get(url)
.subscribe(
data => console.log('success', data),
error => console.log('error', error)
);
}
}
test.service.spec.ts:
import { HttpClient, HttpHandler } from '@angular/common/http';
import { TestBed, inject } from '@angular/core/testing';
import { TestService } from './test.service';
describe('TestService',() => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [HttpClient, HttpHandler, TestService]
});
});
it('should executeGet', inject([TestService], (svc: TestService) => {
expect(svc.executeGet).toBeDefined();
// this is where the 'undefined' error occurs
svc.executeGet('http://www.example.com');
}));
});
Jede mögliche Anleitung oder Zeiger sehr geschätzt.
Sie wirklich eine echte HttpClientModule brauchen? Laut [Dokumentation] (https://angular.io/guide/http#testing-http-requests) - das HTTP-Backend muss als Teil einer guten Testpraxis verspottet werden. –
@AleksandrPetrovskij Ich habe die verfügbare Dokumentation gelesen. Es ist ziemlich dünn und HttpClientModule ist jung genug, dass es nicht viele Inhalte von Drittanbietern gibt, wie man es benutzt. Beim Versuch, HttpClientTestingModule zu verwenden, habe ich andere Probleme festgestellt, aber ich habe mich entschieden, sie nicht in diesen Beitrag aufzunehmen, um den Fokus auf den Fehler 'undefiniert' zu legen. Egal, –