угловое 6 модульное тестирование на http сервисных ошибках - PullRequest
0 голосов
/ 19 октября 2018

Я получаю ошибки при попытке протестировать один из моих сервисов.

В сервисе есть метод, который делает запрос POST на сервере и затем возвращает данные, да, я знаю, почему POST, а не GET.

Мне нужно сказать, что я не могу использовать службу аутентификации, потому что при входе в систему я получаю токены с сервера.Поскольку я не могу войти в систему, чтобы получить токен, все запросы недействительны.

Как выполнить модульное тестирование HTTP-вызовов без отправки запросов на сервер, просто используя локальные данные, которые имитируют ответ сервера.

мой сервис такой.

inventory.service.ts

  /**
   * GETS THE INVENTORY DATA.
   * @returns Observable of inventory data from the server.
   */
  getInventoryData<T>() {

    const options = { headers: this.getHeaders() };
    const body: AdditionFiltersEntity = this.shared.getAdditionFilters({});
    const url = `${this.shared.baseUrl}/inventory`;

    return this.http.post(url, body, options).pipe(
      tap(val => console.log(`BEFORE MAP: ${val}`)),
      map(res => res.json()),
      catchError(e => this.shared.handleError(e))
    );

  }

Проблема в том, что у меня есть catchError(e => this.shared.handleError(e)), который проверяет, есть ли в ответе ошибки в моем случае, у меня есть«UNAUTHORIZED» statusText

В моем случае, я постоянно сталкиваюсь с этим типом ошибок во всех HTTP-тестах.

status: 401, ok: false, statusText: «UNAUTHORIZED»но это нормально, так как я провожу модульное тестирование, я не могу пройти часть авторизации.

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

inventory.service.spec.ts

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

// Modules
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HttpModule } from '@angular/http';
import { MatSnackBarModule } from '@angular/material';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { HttpClientModule } from '@angular/common/http';
import { RouterTestingModule } from '@angular/router/testing';

// Services
import { InventoryService } from './inventory.service';
import { HelpersService } from '@app-services/helpers/helpers.service';
import { MediatorService } from '@app-services/mediator/mediator.service';
import { AuthService } from '@app-services/auth/auth.service';
import { StorageService } from '@app-services/storage/storage.service';

// Models
import { InventoryEntity } from '@app-models/inventory';



describe('InventoryService', () => {

  // let service: InventoryService;
  let httpMock: HttpTestingController;
  let auth: AuthService;
  // let user: User;

  beforeEach(() => {

    TestBed.configureTestingModule({
      imports: [ HttpModule, MatSnackBarModule, RouterTestingModule, HttpClientModule,
      HttpClientTestingModule, BrowserAnimationsModule
    ],
      providers: [
        InventoryService, AuthService, HelpersService, MediatorService, StorageService
      ]
    });


    httpMock  = TestBed.get(HttpTestingController);
    auth      = TestBed.get(AuthService);
    localStorage.setItem('store_ids', JSON.stringify([1])); // just set a test id so we gonna get some kind data.

  });


  beforeEach(async(() => {
    TestBed.compileComponents().catch(error => console.error(error));
  }));

  it('should be created', inject([InventoryService], (service: InventoryService) => {
    expect(service).toBeTruthy();
  }));

  // This is where I get the errors
  fit('Should get inventory data', inject([InventoryService], async (service: InventoryService) => {

    await service.getInventoryData().subscribe( (res: InventoryEntity[]) => {

      // get array first element keys.
      const evaluationKeys = ['brand', 'color_code', 'color_tag', 'family', 'frame_size', 'gender', 'provider', 'quantity', 'tag'];
      const keys = Object.keys(res[0]);

      expect(keys).toEqual(evaluationKeys);

    });

  }));


});
  • Может кто-нибудь объяснить мне, как выполнять модульные тесты для HTTP-вызовов, как этот service.getInventoryData().subscribe

  • И как бороться с аутентификациейчасть.Аутентификация - это когда все мои тесты не пройдены.

  • Если мне нужно использовать фиктивные данные, как это сделать, может кто-нибудь показать мне пример?

Ответ должен дать мне эти данные.

[
  {
    'brand': 'brand-1',
    'color_code': '593',
    'color_tag': 'SILVER',
    'family': 'SOL',
    'frame_size': '54x16x140',
    'gender': 'Unisexe',
    'provider': 'hgg',
    'quantity': 82,
    'tag': '44554'
  }, {
    'brand': 'brand-2',
    'color_code': 'MAU1O1',
    'color_tag': 'BLACK',
    'family': 'SOL',
    'frame_size': '54x17x140',
    'gender': 'Unisexe',
    'provider': 'hgg',
    'quantity': 98,
    'tag': '45445'
  }
]

1 Ответ

0 голосов
/ 19 октября 2018

Как предлагается в комментариях, вам не нужно беспокоиться о своем http-вызове, когда модульное тестирование .Я ожидаю, что ответ API тестируется отдельно на стороне сервера.При тестировании сервиса моей задачей было бы проверить, что мой сервис делает то, что должен, правильно , предполагая, что ответ доступен.Если нет, то вы можете проверить, правильно ли ваш сервис обрабатывает ответ об ошибке).Вы можете прочитать больше об этом на Жасмин Документы

Итак, в этом случае я обычно буду издеваться над моим ответом.Вы можете использовать jasmine spy для слежки за служебным вызовом, например spy.On(service, 'getInventoryData').and.returnValues(of({your json});.

Или, если вы чувствуете, что у вас очень большой JSON, сохраните его в папке локальных ресурсов, например: app / test/ resources / response1.json` и затем импортируйте его в свою спецификацию, например:

const response: any = require('../test/resources/response1.json');

...