unit test karma and unit-testing angular mocking karma-jasmine

unit testing - test - Simulacro de servicio personalizado en angular2 durante la prueba unitaria



unit test angular 5 (1)

Es por esto

@Component({ providers: [PonyService] <====== })

Esto hace que el servicio alcance el componente, lo que significa que Angular lo creará para cada componente, y también significa que reemplaza a cualquier proveedor global configurado a nivel de módulo. Esto incluye el proveedor simulado que configura en el banco de pruebas.

Para evitar esto, Angular proporciona el método TestBed.overrideComponent , que nos permite anular elementos como @Component.providers y @Component.template .

TestBed.configureTestingModule({ declarations: [PoniesComponent, PonyComponent] }) .overrideComponent(PoniesComponent, { set: { providers: [ {provide: PonyService, useClass: MockPonyService} ] } });

Intento escribir una prueba unitaria para el componente utilizado en mi servicio. El componente y el servicio funcionan bien.

Componente:

import {Component} from ''@angular/core''; import {PonyService} from ''../../services''; import {Pony} from "../../models/pony.model"; @Component({ selector: ''el-ponies'', templateUrl: ''ponies.component.html'', providers: [PonyService] }) export class PoniesComponent { ponies: Array<Pony>; constructor(private ponyService: PonyService) { this.ponies = this.ponyService.getPonies(2); } refreshPonies() { this.ponies = this.ponyService.getPonies(3); } }

Servicio:

import {Injectable} from "@angular/core"; import {Http} from "@angular/http"; import {Pony} from "../../models/pony.model"; @Injectable() export class PonyService { constructor(private http: Http) {} getPonies(count: number): Array<Pony> { let toReturn: Array<Pony> = []; this.http.get(''http://localhost:8080/js-backend/ponies'') .subscribe(response => { response.json().forEach((tmp: Pony)=> { toReturn.push(tmp); }); if (count && count % 2 === 0) { toReturn.splice(0, count); } else { toReturn.splice(count); } }); return toReturn; }}

Prueba de unidad de componentes:

import {TestBed} from "@angular/core/testing"; import {PoniesComponent} from "./ponies.component"; import {PonyComponent} from "../pony/pony.component"; import {PonyService} from "../../services"; import {Pony} from "../../models/pony.model"; describe(''Ponies component test'', () => { let poniesComponent: PoniesComponent; beforeEach(() => { TestBed.configureTestingModule({ declarations: [PoniesComponent, PonyComponent], providers: [{provide: PonyService, useClass: MockPonyService}] }); poniesComponent = TestBed.createComponent(PoniesComponent).componentInstance; }); it(''should instantiate component'', () => { expect(poniesComponent instanceof PoniesComponent).toBe(true, ''should create PoniesComponent''); }); }); class MockPonyService { getPonies(count: number): Array<Pony> { let toReturn: Array<Pony> = []; if (count === 2) { toReturn.push(new Pony(''Rainbow Dash'', ''green'')); toReturn.push(new Pony(''Pinkie Pie'', ''orange'')); } if (count === 3) { toReturn.push(new Pony(''Fluttershy'', ''blue'')); toReturn.push(new Pony(''Rarity'', ''purple'')); toReturn.push(new Pony(''Applejack'', ''yellow'')); } return toReturn; }; }

Parte del paquete .json:

{ ... "dependencies": { "@angular/core": "2.0.0", "@angular/http": "2.0.0", ... }, "devDependencies": { "jasmine-core": "2.4.1", "karma": "1.2.0", "karma-jasmine": "1.0.2", "karma-phantomjs-launcher": "1.0.2", "phantomjs-prebuilt": "2.1.7", ... } }

Cuando ejecuto ''karma start'' obtengo este error

Error: error en la clase ./PoniesComponent PoniesComponent_Host - plantilla en línea: 0: 0 causada por: ¡Ningún proveedor para Http! en config / karma-test-shim.js

Parece que karma usa PonyService lugar de burlarse de MockPonyService , a pesar de esta línea: providers: [{provide: PonyService, useClass: MockPonyService}] .

La pregunta: ¿cómo debería burlarme del servicio?