Привет, спасибо за ваше время:
Я пытаюсь узнать, как тестировать службу, которая имеет метод возврата Observable.
Я проделал экскурсию по руководству героев страницы "Угловая" до модуля маршрутизации, и я бы хотел, чтобы блок тестировал код.
Вот MyHeroService:
import {Injectable} from '@angular/core';
import {HEROES} from '../mock-heroes';
import {Hero} from '../Hero';
import {Observable} from 'rxjs/Observable';
import {of} from 'rxjs/observable/of';
import {MessageService} from '../message.service';
@Injectable()
export class MyHeroService {
getHeroes(): Observable<Hero[]> {
this.messageService.add('HeroService: fetched all your heroes');
return of(HEROES);
}
getHero(id: number): Observable<Hero> {
// Todo: send the message _after_ fetching the hero
this.messageService.add('HeroService: fetched hero id=${id}');
return of(HEROES.find(hero => hero.id === id));
}
constructor(private messageService: MessageService) {
}
}
И вот единичный тест, который я сейчас делаю:
import {MyHeroService} from './my-hero.service';
import {MessageService} from '../message.service';
import {async, inject} from '@angular/core/testing';
describe('heroService', () => {
it('should return an Observable of Hero[]', async(() => {
const myHeroService = new MyHeroService(new MessageService([]));
myHeroService.getHero(1).subscribe(result => expect(result).toBeGreaterThan(0));
}));
});
Результат, который дает тест:
Я также прочитал: Единичное тестирование наблюдаемого в Angular 2
Единичный тест "успех" и "ошибка" наблюдаемого ответа в компоненте для углового 2
Угловой 2 Неисправный слуховой аппарат Karma Jasmine Unit
Не могли бы вы помочь мне, пожалуйста, понять, почему он дает "Ожидаемое неопределенное значение больше 0."
Я думаю, что ваша проблема в том, что вы не правильно вводите свою услугу (вы импортируете "инъекцию" из "@angular/core/testing", но не используете ее).
Лучший способ проверить угловое обслуживание - это метод Angular TestBed, который:
Настраивает и инициализирует среду для модульного тестирования и предоставляет методы для создания компонентов и сервисов в модульных тестах.
import { TestBed, inject, async} from '@angular/core/testing';
import { HeroService } from './hero.service';
describe('Testing Angular Heroes', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
HeroService
]
}).compileComponents();
}));
describe("Testing my awesome function", () => {
it('should return true when I call getTrue', inject([HeroService], (heroService: HeroService) => {
expect(heroService.getTrue()).toBe(true)
}));
})
});
Здесь находится plunkr, работающий с Jasmine и приведенный ниже пример: https://embed.plnkr.co/Kgkozh7gZ9GMdwHgjcph/
Источники:
https://blog.thoughtram.io/angular/2016/11/28/testing-services-with-http-in-angular-2.html https://angular.io/api/core/testing/TestBed