Как правильно выполнить модульный тест, выдавая ошибку для API-сервисов с Jasmine in Angular? - PullRequest
0 голосов
/ 01 ноября 2018

Я довольно новичок в Angular и Jasmine Framework. Я написал несколько API-сервисов, обертывающих HttpClient для выполнения вызовов get / post, и теперь я хочу протестировать метод get, чтобы убедиться, что он правильно перехватывает и выдает правильную ошибку.

Мой api.service.ts выглядит так:

import { Injectable } from '@angular/core';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';
import { throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})

export class ApiService {

  constructor(private http: HttpClient) { }

  // simple wrapper to throw error
  handleErrors(error: any) {
    return throwError(error);
  }

  /**
   * Method: get(url, { params })
   */
  get(url: string, params: HttpParams = new HttpParams()): Observable<any> {
    return this.http.get(url, { params })
      .pipe(catchError(this.handleErrors));
  }
}

Мой api.service.spec.ts выглядит следующим образом:

import {TestBed, inject, async} from '@angular/core/testing';
import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
import {ApiService} from './api.service';
import {HttpClient, HttpErrorResponse, HttpParams} from "@angular/common/http";
import {of} from "rxjs";

describe('ApiService', () => {
  beforeEach(() => TestBed.configureTestingModule({
    imports: [HttpClientTestingModule],
    providers: [ApiService]
  }));

  afterEach(inject([HttpTestingController], (httpMock: HttpTestingController) => {
    httpMock.verify();
  }));

  it('should be created', () => {
    const service: ApiService = TestBed.get(ApiService);
    expect(service).toBeTruthy();
  });

  it('should throw error properly',
    async(
      inject([HttpClient, ApiService], (http: HttpClient, apiService: ApiService) => {
          const err = {status: 404, statusText: 'Not Found'};
          spyOn(http, 'get').and.throwError(JSON.stringify(err))
          apiService.get('testUrl');
          expect(apiService.get).toThrow(JSON.stringify(err));
        }
      )
    )
  );
});

Поэтому, когда я запускаю тест, я получаю только одну строку сообщения:

Failed: {"status":404,"statusText":"Not Found"}

Кажется, выдает правильную ошибку, но тест не пройден. Я запутался здесь, как написать тест, чтобы знать, что он правильно генерирует ошибку, которая будет перехвачена и обработана handleErrors, так что я знаю, что .pipe(catchError(this.handleErrors)) на самом деле работает?

Спасибо.

1 Ответ

0 голосов
/ 01 ноября 2018

Попробуйте это:

expect(error.status).toEqual(404, 'status');
expect(error.error).toEqual(statusText, 'Not Found');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...