TypeError: Невозможно прочитать свойство 'length' с нулевым значением в файле спецификации машинописного текста - PullRequest
1 голос
/ 30 мая 2019

Я получаю TypeError: Cannot read property 'length' of null при тестировании моего компонента.как это исправить?

вот html:

<header-nav
    [eventList]="eventList$ | async"
    [eventListSize]="(eventList$ | async).length"
    (selectedEvent)="eventSelected($event)"
    (setLang)="langChanged($event)"
    [currentLang]="currentLang$ | async"
    [langList] = "langList$ | async"
    (leftNavi) = "leftNaviHandler($event)"
    >

вот файл ts:

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Store, select } from "@ngrx/store";
import { Observable } from "rxjs";
import { ModelEvent, EventState } from "./../../../calendar/models/model.event";
import { ModelLang, ModelLonguage } from "./../../../shared-components/models/models";
import { CalendarActions, Load, EventSelected } from "./../../../calendar/state/calendar.actions";
import * as fromRoot from  "./../../../calendar/state";
import * as fromObservables from  "./../../state";
import { Lang, LoadLang } from "./../../state/actions/shared.actions";
import { ShowNavi } from "./../../../shared-components/state/actions/shared.actions";

@Component({
    selector: 'header-nav-shell',
    templateUrl: './header-nav-shell.component.html',
    styleUrls: ['./header-nav-shell.component.scss']
})
export class HeaderNavShellComponent implements OnInit {
    /**
    * declartion of observable events
    */
    eventList$:Observable<ModelEvent[]>;
    eventListSize$:number;
    currentLang$:Observable<string>;
    langList$:Observable<ModelLonguage[]>;

    constructor(private store:Store<fromRoot.NewState>, private router:Router) { }

    ngOnInit() {
        this.store.dispatch(new Load());
        this.store.dispatch( new LoadLang());
        this.eventList$ = this.store.pipe(select(fromRoot.getEvents));
        this.currentLang$ = this.store.pipe(select(fromObservables.getCurrentLang));
        this.langList$ = this.store.pipe(select(fromObservables.getLangList));
    }

    eventSelected(event) {
        this.store.dispatch(new EventSelected(event));
        this.router.navigateByUrl("iboCalendar");
    }

    langChanged(event) {
        this.store.dispatch( new Lang(event.Name));
    }

    leftNaviHandler(event):void {
        this.store.dispatch(new ShowNavi(event));
    }

}

вот файл спецификации:

import { async, fakeAsync, tick, ComponentFixture, TestBed } from '@angular/core/testing';

import { HeaderNavShellComponent } from './header-nav-shell.component';
import { HeaderComponent } from './../../header/header.component';
import { HeaderNavComponent } from './../../components/header-nav/header-nav.component';
import { StoreModule, Store  } from '@ngrx/store';
import { TranslateFakeLoader,TranslateLoader,TranslateModule,TranslateService, TranslateStore } from '@ngx-translate/core';
import { RouterTestingModule } from '@angular/router/testing';
import { reducerShared } from "./../../state/reducers/shared.reducer";
import { HttpClientModule, HttpClient } from '@angular/common/http';


describe('HeaderNavShellComponent', () => {

    let component: HeaderNavShellComponent;
    let fixture: ComponentFixture<HeaderNavShellComponent>;

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [ HeaderNavShellComponent, HeaderComponent, HeaderNavComponent ],
            imports:[
                HttpClientModule,
                StoreModule.forRoot({}),
                RouterTestingModule,
                TranslateModule.forChild({
                  loader: {
                        provide: TranslateLoader,
                        useClass: TranslateFakeLoader
                  }
                })
            ],
            providers:[TranslateService, TranslateStore, Store, HttpClient ]
        })
        .compileComponents();
    }));

     beforeEach(fakeAsync(() => {
        fixture = TestBed.createComponent(HeaderNavShellComponent);
        component = fixture.componentInstance;
        tick(1000);
        fixture.detectChanges();
    }));


    it('should create', fakeAsync(() => {
        expect(component).toBeTruthy();
    }));

});

Ошибка:

  TypeError: Cannot read property 'length' of null
            at Object.eval [as updateDirectives] (ng:///DynamicTestModule/HeaderNavShellComponent.ngfactory.js:34:98)
            at Object.debugUpdateDirectives [as updateDirectives] (node_modules/@angular/core/fesm5/core.js:23813:1)
            at checkAndUpdateView (node_modules/@angular/core/fesm5/core.js:23209:1)
            at callViewAction (node_modules/@angular/core/fesm5/core.js:23450:1)
            at execComponentViewsAction (node_modules/@angular/core/fesm5/core.js:23392:1)
            at checkAndUpdateView (node_modules/@angular/core/fesm5/core.js:23215:1)
            at callWithDebugContext (node_modules/@angular/core/fesm5/core.js:24079:1)
            at Object.debugCheckAndUpdateView [as checkAndUpdateView] (node_modules/@angular/core/fesm5/core.js:23781:1)
            at ViewRef_.push.../node_modules/@angular/core/fesm5/core.js.ViewRef_.detectChanges (node_modules/@angular/core/fesm5/core.js:21590:1)
            at ComponentFixture.push.../node_modules/@angular/core/fesm5/testing.js.ComponentFixture._tick (node_modules/@angular/core/fesm5/testing.js:227:1)

что я тут не так делаю?кто-нибудь понять меня, пожалуйста? Я получаю длину из асинхронного значения.

Заранее спасибо

1 Ответ

1 голос
/ 02 июня 2019

Попробуйте создать заглушку, как показано ниже для обработки store службы:

class StoreStub(val){
  if(val === fromRoot.getEvents){ 
   //event action will have values as you are passing "fromRoot.getEvents" in component
    return of({
       //expected object of events
    })
  }else if(val === fromObservables.getCurrentLang){ 
    //event action will have values as you are passing "fromObservables.getCurrentLang" in component
    return of({
       //expected object of events
    })
  }

 // and so on.....

}

, а затем используйте useClass:

providers:[TranslateService, TranslateStore, {provide: Store, useClass: StoreStub}, HttpClient ]
...