2017-04-01 77 views
0

我想用包含控件窗體函數的單獨formControle文件依賴項來測試ReactiveFormsControle。我需要使用observable來傳遞窗體控件並返回錯誤信息。但是當我試圖測試,我有這個錯誤:TypeError:無法讀取屬性'地圖'undefinedkarma測試:TypeError:無法讀取未定義的屬性'地圖'

任何人都可以幫助我請。

這是我的代碼:

這是我怎麼能叫的形式控制功能(進程信息):

ngAfterViewInit(): void { 
// Watch for the blur event from any input element on the form. 
let controlBlurs: Observable<any>[] = this.formInputElements 
    .map((formControl: ElementRef) => Observable.fromEvent(formControl.nativeElement, 'blur')); 
// Merge the blur event observable with the valueChanges observable 
Observable.merge(this.signUpForm.valueChanges, ...controlBlurs).debounceTime(1000).subscribe(value => { 
    this.displayeErrorMessage = this.formValidator.processMessages(this.signUpForm); 
}); 

}

而processMessage功能:

processMessages(container : FormGroup) : {[key : string]: string}{ 

let messages = {}; 

for(let controlKey in container.controls){ 
    if(container.controls.hasOwnProperty(controlKey)){ 
    let c = container.controls[controlKey]; 

    if(c instanceof FormGroup){ 
     let childMessages = this.processMessages(c); 
     Object.assign(messages, childMessages); 
    }else { 

     if(this.validationErrorMessages[controlKey]){ 
     messages[controlKey]=''; 
     if((c.dirty || c.touched) && c.errors){ 
      Object.keys(c.errors).map(messageKey =>{ 
      if(this.validationErrorMessages[controlKey][messageKey]){ 
       messages[controlKey] += this.validationErrorMessages[controlKey][messageKey] + ' ' 
      } 
      }) 
     } 
     } 
    } 
    } 
} 
return messages; 

}

*此測試代碼,處理錯誤*

beforeEach(() => { 
fixture = TestBed.createComponent(SignUpComponent); 
component = fixture.componentInstance; 
debugHelpblck = fixture.debugElement.queryAll(By.css('.help-block')); 
component.ngOnInit(); 
component.ngAfterViewInit(); // this handle the error 
fixture.detectChanges(); 

});

回答

-1

map()之前添加filter(Boolean),或更加小心你的數據(;

不知道從哪裏出現的錯誤,如果是這樣,那麼所有的代碼:

let controlBlurs: Observable<any>[] = this.formInputElements 
    .filter(Boolean) 
    .map(...) 

Object.keys(c.errors).filter(Boolean).map(messageKey =>{...}) 

應該修復錯誤...

+0

感謝您的回覆,karma chow這個消息:'TypeError:無法讀取未定義的屬性'過濾器',我想問題是Observable沒有被我的spec文件識別,但我不知道我該如何解決這個問題或者在spec中聲明observable文件。 –

+0

是'formInputElements'數組還是可觀察的? – Sasxa

+0

formInputElement是未定義的,這是它的聲明:'@ViewChildren(FormControlName,{read:ElementRef})formInputElements:ElementRef [];' –

相關問題