TypeError: Невозможно установить свойство 'search' из неопределенного - PullRequest
0 голосов
/ 31 мая 2018

Я искал и не могу найти ответ на свой вопрос.У меня есть проект Angular 5, и я пытаюсь запустить свои модульные тесты, и я получаю сообщение об ошибке:

TypeError: Cannot set property 'search' of undefined

Вот мой файл TS:

import { Component, OnChanges, OnInit, Input } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { CheckboxModule } from '@common-web-components';

import { ItemFilter } from '../../models/item-filter';
import { ItemBrandSearchResponse } from '../../models/item-brand-search-response';
import { ItemBrandSearchResponseService } from '../../services/item-brand-search-response.service';

@Component({
  selector: 'app-item-brand-filter',
  templateUrl: './item-brand-filter.component.html',
  styleUrls: ['./item-brand-filter.component.css']
})
export class ItemBrandFilterComponent implements OnInit, OnChanges {

  @Input()
  filter: ItemFilter;

  availableCount: number;
  firstOpen: Boolean = true;
  searching: Boolean = true;
  itemBrands = new Array<ItemBrandSearchResponse>();

  constructor(private itemBrandSearchResponseService: ItemBrandSearchResponseService) { }

  ngOnInit() {
    this.searching = true;
    this.firstOpen = false;
    this.getItemBrandForFilter();
  }

  ngOnChanges() {
    if (!this.firstOpen) {
      this.searching = true;
      this.getItemBrandForFilter();
    }
  }

  getItemBrandForFilter(): void {
    this.itemBrandSearchResponseService.get(this.filter).subscribe(
      results => {
        this.itemBrands = results.data;

        if (results.availableCount) {
          this.availableCount = results.availableCount;
        }
        this.searching = false;
      },
      error => {
        console.error('Error getting items');
      }
    );
  }

  getRouterLink(): string {
    return this.filter.search === '' ? '/items' : '/items/search/' + this.filter.search;
  }

}

И здесьмой файл спецификации:

import { FormsModule } from '@angular/forms';
import { async, ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { CheckboxModule } from '@kehe-dev/connect-common-web-components';

import { ItemBrandFilterComponent } from './item-brand-filter.component';
import { ItemBrandSearchResponseService } from '../../services/item-brand-search-response.service';
import { ItemFilter } from '../../models/item-filter';

describe('Component: ItemBrandFilterComponent', () => {
  let component: ItemBrandFilterComponent;
  let fixture: ComponentFixture<ItemBrandFilterComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [
        ItemBrandFilterComponent
      ],
      imports: [
        CheckboxModule,
        FormsModule,
        HttpClientTestingModule,
        RouterTestingModule
      ],
      providers: [
        ItemBrandSearchResponseService
      ]
    })
    .compileComponents();
   }));

  beforeEach(() => {
    fixture = TestBed.createComponent(ItemBrandFilterComponent);
    component = fixture.componentInstance;
    component.filter.search = 'test';
    fixture.detectChanges();
  });

  it('should create', inject([ItemBrandSearchResponseService], (service: ItemBrandSearchResponseService) => {
    expect(component).toBeTruthy();
  }));
});

У меня изначально не было строки:

component.filter.search = 'test';

И у меня была ошибка:

TypeError: Cannot read property 'search' of null

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

1 Ответ

0 голосов
/ 31 мая 2018

Я нашел свое решение.В тестовой среде мой component.filter не был инициализирован.

Поэтому я добавил:

component.filter = new ItemFilter();

И это решило мою проблему.Довольно очевидно сейчас!

...