Разъяснение этой жасминовой ошибки: this.http.get не является разъяснением функции - PullRequest
0 голосов
/ 05 июля 2018

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

loadUser() {
this.httpService.getData(AppConfig.URL_UserById + "?UserID=" + this.userId)
  .catch((error: Response | any) => {
    this.showAlertWindow(this.exceptionMessage);
    console.error(error.message || error);
    return Observable.throw(error.message || error);
  })

Эта часть извлекает данные из URL и выдает ошибку, если есть проблема. getData - это сервис, который делает запрос get. Я просто пытаюсь проверить, вызывается ли метод showAlertWindow. Теперь я почти уверен, что мой тестовый код правильный, но мне что-то не хватает, чтобы получить эту ошибку. Я предполагаю, что Жасмин не знает, что делать со строкой this.httpService.getData(...) Спасибо.

Тест:

  fit('should have getUsers() call showAlertWindow', () => {

 let window = spyOn(userComponent, 'showAlertWindow');

 userComponent.loadUser(); //Fails here

 expect(window).toHaveBeenCalled();

})

Полная ошибка:

    Error: Cannot call Promise.then from within a sync test.
Error: Cannot call Promise.then from within a sync test.
    at SyncTestZoneSpec.webpackJsonp../node_modules/zone.js/dist/zone-testing.js.SyncTestZoneSpec.onScheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:365:1)
    at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.scheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:401:1)
    at Zone.webpackJsonp../node_modules/zone.js/dist/zone.js.Zone.scheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:232:1)
    at Zone.webpackJsonp../node_modules/zone.js/dist/zone.js.Zone.scheduleMicroTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:252:1)
    at scheduleResolveOrReject (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:862:1)
    at ZoneAwarePromise.then (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:962:1)
    at ApplicationInitStatus.webpackJsonp../node_modules/@angular/core/esm5/core.js.ApplicationInitStatus.runInitializers (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/esm5/core.js:3580:1)
    at TestBed.webpackJsonp../node_modules/@angular/core/esm5/testing.js.TestBed._initIfNeeded (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/esm5/testing.js:1011:1)
    at TestBed.webpackJsonp../node_modules/@angular/core/esm5/testing.js.TestBed.get (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/esm5/testing.js:1050:1)
    at Function.webpackJsonp../node_modules/@angular/core/esm5/testing.js.TestBed.get (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/esm5/testing.js:834:1)

Если кто-нибудь может дать мне некоторое представление о значении этой ошибки, это было бы здорово. Спасибо.

Тестовая конфигурация:

import { HttpService } from '../../services/http.service';
import { TestBed, async, inject, fakeAsync, ComponentFixture } from "@angular/core/testing";
import { UserComponent } from './user.component';
import { Observable } from 'rxjs';


    fdescribe('User Component', () => {
    let httpService: HttpService;
    let userComponent: UserComponent

beforeEach(async() => {
    TestBed.configureTestingModule({
      declarations: [
        UserComponent, 
      ],
 providers: [
  HttpService,
 ],
 }).compileComponents();
  });
   beforeEach(() => {
 userComponent = fixture.componentInstance;
 httpService = TestBed.get(HttpService);

 fit('should have getUsers() call showAlertWindow', () => {

     let window = spyOn(userComponent, 'showAlertWindow');

     userComponent.loadUser();

     expect(window).toHaveBeenCalled();


   })

Редактировать: Есть два возможных решения. Я решил ошибку, следя за моим сервисом и возвращая наблюдаемое. spyOn(httpService, 'getData).and.returnValue(Observable.of('test')); Или решение JanRecker, которое более практично.

1 Ответ

0 голосов
/ 05 июля 2018

Вы издевались над вашим HttpService?

Если вы создали экземпляр своего сервиса в UnitTests, то он попытается обработать этот метод. Я предполагаю, что в вашем HttpService вы используете Angular HTTPClient Service (я так думаю из-за ошибки "this.http.get")

Теперь вы создали экземпляр своего Сервиса, но не его зависимостей. И в UnitTests вы должны создавать все вручную. Поэтому в ваших тестах служба Angular "http" не запущена и не работает.

У меня есть привычка издеваться над ВСЕМ, это не мой тестируемый компонент / сервис. Так что в вашем случае я бы сделал что-то вроде

 TestBed.configureTestingModule({
    declarations: [YourComponentUnderTest],
    providers: [
        {provide: YourHttpService, useClass: MockYourHttpService} 
    ]
});
let httpService = TestBed.get(YourHttpService);

MockYourHttpService - это скелет, похожий на оригинальный сервис, но без причудливых реализаций. Теперь вы можете смоделировать эту услугу, как вам нравится

spyOn(httpService, 'getData').and.returnValue(yourMockedData)

В качестве альтернативы вы можете импортировать HttpClientTestingModule и смоделировать вызов «this.http.get», но тогда компонент Unit Test будет неявно тестировать части вашего httpService.

С уважением

...