Angular Service Test Невозможно вызвать Promise.then из теста синхронизации - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть этот сервис:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators';

import { environment } from '@environments/environment';
import { Resource } from '../models/resource';
import { ToastrService } from 'ngx-toastr';

@Injectable({
    providedIn: 'root',
})
export class DataService<T extends Resource> {
    items: BehaviorSubject<T[]>;

    constructor(private endpoint: string, private http: HttpClient, private toastr: ToastrService) {
        this.items = new BehaviorSubject<T[]>([]);
    }

    initialize(feedId: number) {
        this.http.get<T[]>(`${environment.apiUrl}/feeds/${feedId}/${this.endpoint}`).subscribe(response => {
            this.items.next(response);
        });
    }

    get(id: number) {
        return this.http.get<T>(`${environment.apiUrl}/${this.endpoint}/${id}`);
    }

    create(filter: any) {
        return this.http.post<T>(`${environment.apiUrl}/${this.endpoint}`, filter).pipe(
            map((response: any) => {
                const message = response.message;
                const item = response.model;

                let items = this.items.value;
                items.push(item);

                this.emit(items, message);

                return response.model;
            }),
        );
    }

    update(filter: any) {
        return this.http.put<T>(`${environment.apiUrl}/${this.endpoint}`, filter).pipe(
            map((response: any) => {
                const message = response.message;
                const item = response.model;

                let items = this.items.value;
                this.remove(items, filter.id);
                items.push(item);

                this.emit(items, message);

                return response.model;
            }),
        );
    }

    delete(id: number) {
        this.http.delete<any>(`${environment.apiUrl}/${this.endpoint}/${id}`).subscribe(response => {
            let items = this.items.value;
            items.forEach((item, i) => {
                if (item.id !== id) return;
                items.splice(i, 1);
            });

            this.emit(items, response.message);
        });
    }

    private remove(items: T[], id: number) {
        items.forEach((item, i) => {
            if (item.id !== id) return;
            items.splice(i, 1);
        });
    }

    private emit(items: T[], message: string) {
        this.items.next(items);
        this.toastr.success(message);
    }
}

У которого есть такой тест:

import { TestBed } from '@angular/core/testing';

import { DataService } from './data.service';
import { Resource } from '@models';

describe('DataService', () => {
    beforeEach(() => TestBed.configureTestingModule({}));

    const service: DataService<Resource> = TestBed.get(DataService);

    it('should be created', () => {
        expect(service).toBeTruthy();
    });
});

Я ожидал бы, что это сработает, но выдает ошибку:

Невозможно вызвать Promise.then из теста синхронизации.

Я рассмотрел другие стеки, но все они связаны с компонентами. Может кто-нибудь объяснить, почему это происходит с моим сервисом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...