Angular Сервисное тестирование с http и другими зависимостями - PullRequest
2 голосов
/ 10 марта 2020

Я написал оболочку для httpclient, которая устанавливает конфигурацию из наблюдаемой, а также использует toastr в случае ошибки. Это не дает сбоя при удалении двух других инъекций конструктора.

В случае, если я высмеиваю RestService, я не могу использовать HttpTestingController, который предоставляет другие полезные методы для тестирования httpclient

rest .service.ts

@Injectable()
export class RestService {
    public baseUrl = null;

    constructor(
        private http: HttpClient,
        private appConfigService: AppConfigService,
        private toast: ToastNotificationService,
    ) {
        this.getConfig();
    }

    get<T>(url, showError = true): Observable<any> {
        return this.http.get<T>(this.baseUrl + url).pipe(
            catchError((error: HttpErrorResponse) => {
                return this.showError(error, showError);
            }),
        );
    }

    private getConfig() {
        this.appConfigService.appConfig$.subscribe(env => {
            this.baseUrl = env.backendUrl + API_PREFIX;
        });
    }

    private showError(error: HttpErrorResponse, showError) {
        let message = Helpers.getErrorMessageFromObject(error);
        if (showError && message) this.toast.showError(message);

        return throwError(error);
    }   
}

rest.service.spe c .ts

import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { TestBed } from '@angular/core/testing';
import { of } from 'rxjs';
import { AppConfigService } from './app-config.service';
import { RestService } from './rest.service';
import { ToastNotificationService } from './toast-notification.service';

describe('RestService', () => {
    let service: RestService;
    let httpMock: HttpTestingController;
    const testData = { name: 'Test Data' };

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [HttpClientTestingModule],
            providers: [
                RestService,
                {
                    provide: AppConfigService,
                    useValue: jasmine.createSpyObj({
                        appConfig$: of(),
                    }),
                },
                {
                    provide: ToastNotificationService,
                    useValue: jasmine.createSpyObj({
                        showError: function () { },
                    }),
                },
            ],
        });

        service = TestBed.get(RestService);
        httpMock = TestBed.get(HttpTestingController);
    });

    afterEach(() => {
        httpMock.verify();
    });

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

    it('should get the data successful', () => {
        service.baseUrl = '';
        const endpoint = '/api/v1/features/1';

        service.get(endpoint).subscribe((data: any) => {
            expect(data).toEqual(testData);
            expect(service.get).toHaveBeenCalled();
            expect(service.get).toHaveBeenCalledWith(endpoint);
        });

        const req = httpMock.expectOne(endpoint);
        expect(req.request.method).toBe('GET');
        req.flush(testData);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...