0

Hallo, ich versuche, meine Komponenten in Angular2 zu testen, habe aber ein Problem, wenn ich versuche, meinen Dienst zu verspotten. Ich befolge derzeit die Angular2-Dokumente zum Testen.Angular2 Testkomponente

Ich rufe meine Backend-API an, die ich aus dem eckigen Dienst erstellt habe, was gut funktioniert, solange ich ein JWT-Token habe. Aber wenn es um das Testen geht, möchte ich nur den Service in meinem Komponententest verspotten.

Dienst

@Injectable() 
export class ItemService { 
    constructor(private _http: AuthHttp, private _store: Store<AppStore>) {} 

     items(): Observable<any[]> { 
      return this._http.get(ENDPOINT_ITEMS, {withCredentials: false}) 
       .map((response: Response) => response.json().data); 
     } 
} 

Komponente

@Component({ 
selector: 'items', 
template: require('./items.component.html'), 
providers: [ItemService] 
}) 

export class ItemsComponent { 
items: Observable<Array<Object>>; 

constructor(private _service: ItemService) {} 

    ngOnInit(): any { 
    this.items = this._service.items(); 
    } 
} 

Komponententest

beforeEach(() => { 
TestBed.configureTestingModule({ 
    declarations: [ ItemsComponent ], 
    providers: [ 
     { provide: ItemService, useValue: itemsMock }, 
    ] 
}); 
fixture = TestBed.createComponent(ItemsComponent); 
itemService = fixture.debugElement.injector.get(ItemService) 

würde ich meine verspottet ItemService mag den useValue, itemsMock zurückzukehren, für mich, so kann ich testen, dass mein HTML-Tags haben die richtigen Daten. Aber es sieht nicht so aus, als ob mein Service richtig verspottet wird?

immer diese Fehlermeldung:

Error: Error in ./ItemsComponent class ItemsComponent_Host - inline template:0:0 caused by: No provider for AuthHttp! in karma.entry.js (line 17341)

Antwort

1

Ihre Komponente hat ItemService in ihren Anbieter. Das bedeutet, dass jedes Mal, wenn eine Instanz der Komponente erstellt wird, eine neue Instanz von ItemService für die Komponente erstellt wird. Der Dienst auf Modulebene wird nicht verwendet.

Ihr Dienst ist zustandslos und hat vermutlich keinen guten Grund, auf Komponentenebene zu sein. Entfernen Sie es von den Providern und stellen Sie sicher, dass es sich in den Providern des Moduls befindet.

+0

Vielen Dank! Einen Schritt weiter und es funktioniert, Zeit um zu refaktorieren! – mertje