Test unitaire angulaire 4 pour un abonnement.
Je veux tester que mon abonnement renvoie un tableau d'utilisateurs. Je veux me moquer d'une liste d'utilisateurs et tester une fonction appelée getUsers.
Le test unitaire d'abonnement ne fonctionne pas. Quelque chose ne va pas avec la syntaxe.
Ceci est mon interface utilisateur:
export interface User {
id: number;
name: string;
username: string;
email: string;
address: {
street: string;
suite: string;
city: string;
zipcode: string;
geo: {
lat: string;
lng: string;
}
};
phone: string;
website: string;
company: {
name: string;
catchPhrase: string;
bs: string;
};
};
C'est mon composant que je veux tester:
import { Component, OnInit } from "@angular/core";
import { Observable } from "rxjs/Observable";
import { UserService } from "../../services/user.service";
import { User } from "../../models/user.model";
@Component({
selector: "home-users",
templateUrl: "./home.component.html"
})
export class HomeComponent implements OnInit {
private listOfUsers: User[];
constructor(private userService: UserService) {
}
ngOnInit() {
this.getUsers();
}
getUsers(): void {
this.userService.getUsers().subscribe(users => {
this.listOfUsers = users;
});
}
}
Ceci est ma tentative de test unitaire:
import { TestBed, async, inject } from "@angular/core/testing";
import { HttpModule } from "@angular/http";
import { HomeComponent } from "./home.component";
import { UserService } from "../../services/user.service";
import { User } from "../../models/user.model";
describe("HomeComponent", () => {
let userService;
let homeComponent;
let fixture;
let element;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
HomeComponent
],
providers: [
UserService
],
imports: [HttpModule]
}).compileComponents();
}));
beforeEach(inject([UserService], s => {
userService = s;
fixture = TestBed.createComponent(HomeComponent);
homeComponent = fixture.componentInstance;
element = fixture.nativeElement;
}));
it("should call getUsers and return list of users", async(() => {
// Arrange
let response: User[] = [];
// Act
homeComponent.getUsers();
fixture.detectChanges();
fixture.whenStable().subscribe(() => {
expect(homeComponent.listOfUsers).toEqual(response);
});
}));
});
Vous en avez besoin (pour la version rxjs 6+, pour l'ancienne version, la réponse est ci-dessous):
import { of } from 'rxjs';
it("should call getUsers and return list of users", async(() => {
const response: User[] = [];
spyOn(userService, 'getUsers').and.returnValue(of(response))
homeComponent.getUsers();
fixture.detectChanges();
expect(homeComponent.listOfUsers).toEqual(response);
}));
Pour les anciens changements de version de rxjs, importez de:
import { of } from 'rxjs';
à
import { of } from 'rxjs/observable/of';