Ошибка типа: невозможно прочитать свойство 'markForCheck' неопределенного теста Angular6 Impure Pipe - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь проверить нечистую трубу с помощью жасмина. Труба отлично работает на нг-серве и выполняет свою функцию анимации текста.

Когда я создаю его экземпляр в моих тестовых примерах и пытаюсь запустить метод transform, я получаю ошибку.

NaturalTypePipe> преобразует «abc» в «abc» Ошибка типа:

Не удается прочитать свойство 'markForCheck' из неопределенного в NaturalType ../ src / app / shared / pipe / natural-type.pipe.ts.NaturalType.typeNextCharacter

Файл моего теста ниже: -

import { ChangeDetectorRef, NgZone } from '@angular/core';
import { NaturalType } from './natural-type.pipe';

describe('NaturalTypePipe', () => {
    let changeDetector: ChangeDetectorRef;
    let ngZone: NgZone;
    let pipe: NaturalType;

    beforeEach(() => {
        pipe = new NaturalType(changeDetector, ngZone);  
    });

    it('should create an instance of natural pipe', () => {
        expect(pipe).toBeTruthy();
    });

    it('transforms "abc" to "abc"', () => {
        expect(pipe.transform('abc')).toBe('abc');
    });
});

Мой код канала выглядит следующим образом: -

import { Pipe, PipeTransform, ChangeDetectorRef, NgZone } from '@angular/core';

/*
 * Animating text as if it was being typed by a user
*/

@Pipe({name: 'naturalType', pure: false})
export class NaturalType implements PipeTransform {
   private typed: string = '';
   private target: string = '';
   private currentIndex: number = -1;
   private timeoutHandle: number = -1;

   constructor( private changeDetector: ChangeDetectorRef, private ngZone: NgZone ) { }

   transform(value: string, mintypingSpeed: number = 30): any {
      if (this.target !== value) {
       clearTimeout(this.timeoutHandle);
       this.typed = '';
       this.currentIndex = -1;
       this.target = value;
       this.typeNextCharacter(mintypingSpeed);
      }
      return this.typed;
   }
   
   private typeNextCharacter(mintypingSpeed: number) {
    this.currentIndex++;
    this.typed = this.target.substr(0, this.currentIndex);
    this.changeDetector.markForCheck();
    if (this.typed !== this.target) {
      const time = Math.round(Math.random() * 70) + mintypingSpeed;
      this.ngZone.runOutsideAngular(() => {
        this.timeoutHandle = <any> setTimeout(()=> {
          this.ngZone.run(() => this.typeNextCharacter(mintypingSpeed));
        },time);
      });  
    }
   }
}

Первоначально я думал, что это может быть связано с частными переменными конструктора и закрытым методом typeNextCharacter в файле канала, и я попробовал несколько вещей, но безуспешно.

Любая помощь будет оценена. Заранее спасибо.

1 Ответ

0 голосов
/ 27 августа 2018

Переменная changeDetector никогда не инициализируется.Итак, строка:

pipe = new NaturalType(changeDetector, ngZone);  

в блоке beforeEach создает новый NaturalType с неопределенным changeDetector.

...