Введенный сервис не работает - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь протестировать компонент Angular 6 с поддельной службой.

Я намерен использовать приведенный ниже код, чтобы иметь вложенные операторы describe, позволяющие различным версиям проверенной службы возвращать разные результаты

Реальный сервис выполняет некоторые HTTP-вызовы, а мой макет возвращает Observable с данными.

Когда я выполняю тест, я вижу, что Жасмин пытается фактически выполнить HTTP-вызов и игнорирует мою ложь

// Core imports
import { async, ComponentFixture, TestBed, inject, fakeAsync } from '@angular/core/testing';
import { FormsModule } from '@angular/forms';
import { DebugElement, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { ActivatedRoute, Params } from "@angular/router";
import { Observable } from "rxjs/Observable"
import 'rxjs/add/observable/of';
import { HttpClientModule } from "@angular/common/http";

// Vendor imports
import { ToastrModule, ToastrService } from 'ngx-toastr';
import { NgbModule } from "@ng-bootstrap/ng-bootstrap";

// Project imports
import { FormComponent } from './form.component';
import { FormService } from "../../services/form.service";
import { DatastoreService } from "../../services/datastore.service";

describe('FormComponent', () => {

   let component: FormComponent;
   let fixture: ComponentFixture<FormComponent>;
   let de: DebugElement;
   let el;

   beforeEach(async(() => {
      console.info('First setup of module');
      return TestBed.configureTestingModule({
         imports: [HttpClientModule, FormsModule, ToastrModule.forRoot(), NgbModule.forRoot()],
         providers: [
            FormService,
            ToastrService,
            DatastoreService,
            {
               provide: ActivatedRoute,
                  useValue: {
                     params: {
                        subscribe: (fn: (value: Params) => void) => fn({
                           tab: 0,
                        }),
                     },
                     snapshot: {
                        url: [{path: 'worker'}],
                        queryParams: {table: 'portal', sysId: undefined}
                     },
                  },
               },
            ],
         declarations: [ FormComponent ],
         schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
      });
   }));

   beforeEach(() => {
      console.info('establishing components');
      fixture = TestBed.createComponent(FormComponent);
      component = fixture.componentInstance;
      fixture.detectChanges();
      de = fixture.debugElement;
      el = de.nativeElement;
   });

   describe('with a form layout containing an invalid element', () => {

      let FormServiceMock = class FormServiceMock {
         constructor() { console.info('instantiated'); }

         public getForm(table) {
            console.log('getForm called');
            return Observable.of({
               "table": "portalx",
               "schema": {
                  "name": {"title": "name", "element_type": "string"},
                  "suffix": {"title": "suffix", "element_type": "string"},
                  "active": {"title": "active", "element_type": "boolean"}
               }, "layout": ["name", "suffix", "notexists", "active"]
            });
         }
      };

      beforeEach( () => {
         console.info('Second re-setup of module');
         TestBed.resetTestingModule();
         return TestBed.configureTestingModule({
            providers: [{ provide: FormService, useClass: FormServiceMock }]
         }).compileComponents();
      });

      fit('ngOnInit sets values correctly', inject([FormService], (service: FormService) => {

         console.info('hello world');
         component.ngOnInit();
         expect(component.portal).toEqual('worker');

      }));

   });

});

Запуск теста жасмина дает мне

Chrome 66.0.3359 (Mac OS X 10.12.6) ОШИБКА Chrome 66.0.3359 (Mac OS X 10.12.6) ОШИБКА Отключено не определено Chrome 66.0.3359 (Mac OS X 10.12.6): выполнено 1 из 37 (пропущено 36)УСПЕХ (1.779 с / 1.655 с) sNm6eZUIrnZxAOwqAAAI с идентификатором 92987428 Chrome 66.0.3359 (Mac OS X 10.12.6): выполнено 0 из 37 УСПЕХ (0 с / 0 с) ИНФОРМАЦИЯ: «Первая настройка модуля» Chrome 66.0.3359 (Mac OS X 10.12.6): выполнено 0 из 37 УСПЕХ (0 с / 0 с) ИНФОРМАЦИЯ: «Первая настройка модуля» 27 05 2018 17: 36: 00.293: ПРЕДУПРЕЖДЕНИЕ [веб-сервер]: 404: / api / services/ ui / form / portal 27 05 2018 17: 36: 00.551: WARN [веб-сервер]: 404: / api / services / ui / form / portal ИНФО: «создание компонентов» Chrome 66.0.3359 (Mac OS X 10.12.6): Выполнено 0 из 37 УСПЕХ (0 секунд / 0 секунд) ИНФОРМАЦИЯ: «установка компонентов» ИНФОРМАЦИЯ: «Вторая перенастройка модуля» Chrome 66.0.3359 (Mac OS X 10.12.6): выполнено 0 из 37 УСПЕХ (0 с / 0 с) INFO: «Вторая перенастройка модуля» INFO: «instantiated» Chrome 66.0.3359 (Mac OS X 10.12.6):Выполнено 0 из 37 УСПЕХ (0 секунд / 0 секунд) ИНФОРМАЦИЯ: 'экземпляр' ИНФОРМАЦИЯ: 'hello world' Chrome 66.0.3359 (Mac OS X 10.12.6): Выполнено 0 из 37 УСПЕХА (0 секунд / 0 секунд) ИНФО:'hello world' LOG: HttpErrorResponse {headers: HttpHeaders {normalizedNames: Map {}, lazyUpdate: null, lazyInit: function () {...}}, статус: 404, statusText: 'Not Found', url: 'http://localhost:9876/api/seLOG: HttpErrorResponse {заголовки: HttpHeaders {normalizedNames: Map {}, lazyUpdate: null, lazyInit: function () {...}}, статус: 404, statusText: 'Not Found', url: 'http://localhost:9876/api/services/ui/form/portal', ok: false, имя: «HttpErrorResponse», сообщение: «Http-ответ об ошибке для http://localhost:9876/api/services/ui/form/portal: 404 Not Found», ошибка: «NOT FOUND»} Chrome 66.0.3359 (Mac OS X 10.12.6):Выполнено 0 из 37 УСПЕХ (0 с / 0 с) LOG: HttpErrorResponse {заголовки: HttpHeaders {normalizedNames: Map {}, lazyUpdate: null, lazyInit: function (){...}}, status: 404, statusText: «Not Found», url: «http://localhost:9876/api/services/ui/form/portal', ok: false, name:« HttpErrorResponse », сообщение:« Http error response для http://localhost:9876/api/services/ui/form/portal:404 Not Found », ошибка:« NOT FOUND »} LOG: HttpErrorResponse {headers: HttpHeaders {normalizedNames: Map {}, lazyUpdate: null, lazyInit: function () {...}}, статус: 404, statusText: 'NotНайдено ', url:' http://localhost:9876/api/seLOG: HttpErrorResponse {заголовки: HttpHeaders {normalizedNames: Map {}, lazyUpdate: null, lazyInit: function () {...}}, статус: 404, statusText: 'Not Found', url: 'http://localhost:9876/api/services/ui/form/portal', ok: false, имя:' HttpErrorResponse ', сообщение:' Http error response для http://localhost:9876/api/services/ui/form/portal: 404 Not Found ', ошибка:' NOT FOUND '} Chrome 66.0.3359 (Mac OS X 10.12.6): выполнено 0 из 37 УСПЕХ (0 с / 0 с) LOG: HttpErrorResponse {заголовки: HttpHeaders {normalizedNames: Map {}, lazyUpdate: null, lazyInit: function () {...}},status: 404, statusText: 'Not Found', url: 'http://localhost:9876/api/seChrome 66.0.3359 (Mac OS X 10.12.6): выполнено 1 из 37 (пропущено 36) SUCCESS (1,638 с / 1,52)с)

В этом выводе журнала я вижу Instantiated, который находится в моем фиктивном конструкторе, но я не вижу, чтобы мой метод getForm вызывался, вместо этого реальный вызывается изоказание услуг.

Chrome 66.0.3359 (Mac OS X 10.12.6) ОШИБКА Отключено не определено 27 05 2018 17: 35: 58.128:

INFO [Chrome 66.0.3359 (Mac OS X 10.12.6)]:    Connected on socket 

любая помощь по этому поводу?

...