Angular2 + Unit Test Service со встроенным серверным сервисом

Я впервые пытаюсь писать модульные тесты. До сих пор я мог писать тесты для "обычных" / стажеров. Теперь я застрял с более сложной службой:

@Injectable()
export class BaseToolsService {

vehicles: Array<Vehicle>;
tools: BehaviorSubject<Array<Tool>> = new BehaviorSubject<Array<Tool>>(undefined);
noBaseTools: BehaviorSubject<Array<Tool>> = new BehaviorSubject<Array<Tool>>(undefined);
vehiclesWithBaseTools: BehaviorSubject<Array<VehicleBaseToolsModel>> = new BehaviorSubject<Array<VehicleBaseToolsModel>>(undefined);

constructor(private readonly toolService: ToolService,
            private readonly vehicleService: VehicleService,
            private readonly notificationService: NotificationService) {
    forkJoin([this.toolService.getTools('Asset,ToolType'),
        this.vehicleService.getVehicles('Asset,VehicleModel')]).subscribe(results => {
        this.tools.next(results[0]);
        this.vehicles = results[1];
        this.filterToolsAndConvertVehicles();
    });
} 

...

Моя настройка модульного теста на данный момент такова:

import {BaseToolsService} from './base-tools.service';
import {ToolService} from '../../../../core/services/api/tool.service';
import {VehicleService} from '../../../../core/services/api/vehicle.service';
import {NotificationService} from '../../../../core/services/intern/notification/notification.service';
import {async, getTestBed, TestBed} from '@angular/core/testing';

    describe('Service: BaseToolsService', () => {

        let service: BaseToolsService;

        beforeEach(async(() => {
            TestBed.configureTestingModule({
                providers: [
                    ToolService,
                    VehicleService,
                    NotificationService,
                    BaseToolsService
                ]
            });
            const testBed = getTestBed();
            service = testBed.get(BaseToolsService);
        }));

    ...
    // Some Tests

Проблема в том, что службы ToolService и VehicleService пытаются получить ответ сервера. Поскольку они встроены в BaseToolsService, я не знаю, как имитировать серверный запрос / бэкэнд или как имитировать сами необходимые данные и предотвратить доступ служб к серверу. Когда я запускаю тест, он, конечно же, выходит из строя с ошибкой Failed: Http failure response for (unknown url): 0 Unknown Error.

Есть ли способ имитировать ответ сервера, который на один уровень глубже, чем услуга, которую я хочу протестировать? Или проблема в другом? (Поскольку я новичок в модульных тестах, я сомневаюсь, что все сделал правильно)

Просто поиздевайтесь над соавторами BaseToolsService, замените их теми, которых не делает запросы. Когда вы тестируете службы, которые делать отправляют запросы напрямую, имитируйте http-клиент в соответствии с документацией: angular.io/guide/http#testing-http-requests. Также есть общее руководство по тестированию: angular.io/guide/testing

jonrsharpe 21.11.2018 14:25

Или, в качестве альтернативы, не имитируйте всю службу в целом, а отслеживайте методы и возвращайте of(data) вместо того, что вернет служба. Посмотри на жасмин, подглядывающий за этим.

Arne 21.11.2018 14:51

Спасибо за помощь @jonrsharpe, мне просто казалось неправильным перезаписывать классы. Но я думаю, это правильный путь.

Adrian 30.11.2018 09:33
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
3
31
0

Другие вопросы по теме